Rutas inesperadas de Python en el entorno Conda

Resuelto dariober asked hace 2 años • 1 respuestas

En un entorno Conda ( baseaquí), 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-packagesse ignorarán si también se encuentran en .local/lib/python3.7/site-packages. De hecho, .local/lib/python3.7/site-packagestengo numpyla 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
dariober avatar Feb 02 '22 22:02 dariober
Aceptado

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 sitemódulo es responsable de configurar sys.pathcuá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 PYTHONNOUSERSITEalternará la carga del nivel de usuario site-packages. A saber,

PYTHONNOUSERSITE=1 python -c "import sys; print(sys.path)"

2: -sbandera de Python

Alternativamente, el binario de Python tiene un -sargumento 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 --userpor 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=1durante la activación del entorno.

Si desea que todos los entornos tengan dicho aislamiento de forma predeterminada, considere agregar esto a la create_default_packageslista 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=1y PYTHONPATH="", que se pueden instalar con:

## set PYTHONNOUSERSITE=1
conda install merv::envvar-pythonnousersite-true

## clear PYTHONPATH
conda install merv::envvar-pythonpath-null
merv avatar Feb 02 '2022 18:02 merv