¿Cómo modificar globalmente el PYTHONPATH predeterminado (sys.path)?

33

En un sistema Ubuntu (10.10), tengo un paquete Python en el que se instala /usr/local/lib/python2.6/site-packages/. Esto no está contenido en la ruta predeterminada (sys.path). ¿Cómo agrego este directorio a la ruta?

Establecer la $PYTHONPATHvariable de entorno es una solución, por supuesto, pero estoy buscando una forma más elegante de hacerlo. Por ejemplo, easy_installtambién incluye paquetes instalados, mi sys.path se ve así:

['', '/usr/local/lib/python2.6/dist-packages/keyring-0.5.1-py2.6.egg', 
'/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk',  
'/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', 
'/usr/local/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages', 
'/usr/lib/python2.6/dist-packages/PIL', '/usr/lib/pymodules/python2.6', 
'/usr/lib/pymodules/python2.6/gtk-2.0']

entonces la ruta obviamente no es la predeterminada incorporada en el binario de Python.

¿Hay un solo archivo de configuración que contenga las entradas anteriores? ¿O de qué maneras es posible modificarlo?

Latanius
fuente

Respuestas:

27

La documentación del módulo del sitio y la Ruta de búsqueda de Modificación de Python parecen ser lo que estás buscando.

Por lo que yo entiendo, esas entradas están siendo agregadas sys.pathpor:

  • /usr/lib/python2.6/site.py
  • /usr/lib/python2.6/dist-packages/site.py
    (Cambie 2.6 a su versión de Python).

La forma más fácil de cambiarlo es agregar un archivo que /usr/local/lib/python2.6/dist-packages/site-packages.pthcontenga ../site-packages.

Alternativamente, ¿tal vez pueda enseñarle a usar el paquete site.getsitepackages()?

Mikel
fuente
1
gracias, funciona perfectamente :) (Terminé agregando un archivo .pth a /usr/local/python2.6/dist-packages, que contiene "../site-packages")
Latanius
1
También puede crear un módulo llamado sitecustomize.pyque site.pyintenta importar y modificar sys.pathallí.
TestUser16418
5

Puede crear un nuevo archivo llamado /etc/profile.d/local_python.shcon el contenido

PYTHONPATH="/usr/local/lib/python2.6/site-packages/":"${PYTHONPATH}"
export PYTHONPATH

Lo cual establecerá la PYTHONPATHvariable para todos los usuarios registrados en su sistema.

TestUser16418
fuente
77
Esto realmente no es universal. El mecanismo /etc/profile.d solo funcionará para shells de inicio de sesión para personas con shells que usan /etc/profile.d (bash / ksh / zsh). Estoy seguro de que los usuarios de csh no verán este cambio. Además, se ignorará en cron / at jobs.
Rich Homolka
2
esta es una buena manera de establecer variables de entorno global (otra cosa que aprendí hoy), pero como mencioné en la publicación, estaba buscando una forma más pitónica :)
Latanius
4

Me gustaría resumir mis hallazgos sobre la modificación del camino de Python. Hay dos maneras de hacerlo.

  • archivo .pth
  • PYTHONPATH

Cualquier archivo .pth que se encuentre en la ruta predeterminada (ver más abajo) incluirá su contenido sys.path. El formato de dicho archivo .pth es simple: una ruta (carpeta) por línea. Sorprendentemente, las rutas pueden ser absolutas o relativas al archivo .pth .

La ruta predeterminada es donde reside el intérprete y <some-prefix>/lib/python<version>/site-packagesdónde <some-prefix>suele estar /usr/.

PYTHONPATHes la variable ambiental de su sistema operativo. En sistemas unix, los enumera por env. La modificación global de tales variables se realiza a través de scripts .sh dentro de la /etc/profile.d/carpeta como se menciona en @ TestUser16418.

katomaso
fuente
2
Es PYTHONPATH sin "_"
heroxbd
1

Por ejemplo, si desea importar el sudsmódulo que está disponible como un .eggarchivo:

egg_path = '/home/shahid/suds_2.4.egg'

sys.path.append(egg_path)

import suds
# ... rest of code
Mohammad Shahid Siddiqui
fuente