Rutas inesperadas de Python en el entorno Conda
En un entorno Conda ( base
aquí), me sorprende el orden de los directorios en la ruta de Python:
python -c "import sys; print(sys.path)"
['',
'/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/lib/python37.zip',
'/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/lib/python3.7',
'/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/lib/python3.7/lib-dynload',
'/export/home/db291g/.local/lib/python3.7/site-packages',
'/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/lib/python3.7/site-packages']
Como puede ver, mi ruta local que no es Conda:
/export/home/db291g/.local/lib/python3.7/site-packages
viene antes de la contraparte de Conda:
/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/lib/python3.7/site-packages
Esto significa que los paquetes de Python instalados en miniconda3/lib/python3.7/site-packages
se ignorarán si también se encuentran en .local/lib/python3.7/site-packages
. De hecho, .local/lib/python3.7/site-packages
tengo numpy
la v1.20, pero en el entorno Conda necesito la v1.19, que está correctamente instalada, pero reemplazada por la v1.20. Esto parece anular el objetivo de utilizar Conda.
¿Hay algún problema con mi configuración o me falta algo aquí?
Alguna información:
which python
/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/bin/python
python -V
Python 3.7.12
which conda
/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/bin/conda
conda --version
conda 4.11.0
Este es el comportamiento esperado (consulte PEP 370 ) y en parte la razón por la que Anaconda recomienda no instalar paquetes a nivel de usuario .
El site
módulo es responsable de configurar sys.path
cuándo se inicializa Python. El códigosite.py
agrega específicamente el sitio del usuario antes de agregar el sitio del prefijo, que es lo que conduce a esta priorización. La motivación según PEP 370 es que los usuarios tendrían Python instalado a nivel de sistema, pero quieren priorizar los paquetes que instalan a nivel de usuario, por lo tanto, el sitio del usuario debe cargarse antes que el sitio del prefijo.
Opciones
Hay varias opciones para evitar que se carguen los paquetes del sitio a nivel de usuario.
1: variable de entorno
La variable de entorno PYTHONNOUSERSITE
alternará la carga del nivel de usuario site-packages
. A saber,
PYTHONNOUSERSITE=1 python -c "import sys; print(sys.path)"
2: -s
bandera de Python
Alternativamente, el binario de Python tiene un -s
argumento para deshabilitar específicamente los paquetes de sitios a nivel de usuario.
python -s -c "import sys; print(sys.path)"
3: Eliminar (y evitar futuras) instalaciones a nivel de usuario
La recomendación de Conda es evitarlo pip install --user
por completo, lo que se interpretaría como que se deben eliminar las ~/.local/lib/python*
carpetas de su sistema.
4: variable de entorno Conda automatizada
Paquete Conda Forge
El paquete Conda Forgeconda-ecosystem-user-package-isolation
se configurará automáticamente PYTHONNOUSERSITE=1
durante la activación del entorno.
Si desea que todos los entornos tengan dicho aislamiento de forma predeterminada, considere agregar esto a la create_default_packages
lista de configuración:
conda config --add create_default_packages conda-ecosystem-user-package-isolation
Tenga en cuenta que este paquete también establece R_LIBS_USER="-"
, aislando cualquier entorno R de los paquetes de nivel de usuario.
Paquetes alternativos
Si desea una opción más granular, también he creado paquetes separados que configuran solo las variables de entorno PYTHONNOUSERSITE=1
y PYTHONPATH=""
, que se pueden instalar con:
## set PYTHONNOUSERSITE=1
conda install merv::envvar-pythonnousersite-true
## clear PYTHONPATH
conda install merv::envvar-pythonpath-null