¿Qué configura sys.path con Python, y cuándo?

Cuando corro

import sys print sys.path 

en mi Mac (Mac OS X 10.6.5, Python 2.6.1), obtengo los siguientes resultados.

 /Library/Python/2.6/site-packages/ply-3.3-py2.6.egg
 ...
 /Library/Python/2.6/site-packages/ipython-0.10.1-py2.6.egg
 /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python26.zip
 /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
 /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-darwin
 /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac
 /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac/lib-scriptpackages

 /System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python
 /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-tk
 /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-old
 /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload
 /Library/Python/2.6/site-packages
 /System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC
 /System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/wx-2.8-mac-unicode

Se agrupan en 5 categorías.

  • /Library/Python/2.6/site-packages/*.egg
  • /Library/Python/2.6/site-packages
  • Frameworks / Python.framework / Versions / 2.6 / lib / python2.6
  • Frameworks / Python.framework / Versions / 2.6 / Extras / lib / python
  • PATH desde la variable de entorno PYTHONPATH.

Y puedo agregar más caminos usando el código

 sys.path.insert(0, MORE_PATH) 
  • ¿Qué rutinas establecen esos caminos, y cuándo?
  • ¿Algunas de las rutas están integradas en el código fuente de Python?
  • ¿Es posible que las rutas insertadas con ‘sys.path.insert’ sean ignoradas? Tengo curiosidad sobre esto, como con mod_wsgi, encontré que las rutas no se encuentran con ‘sys.path.insert’. Le pregunté a otro post por esta pregunta.

ADICIONAL

Basado en la respuesta de Michael, busqué en site.py y obtuve el siguiente código.

 def addsitepackages(known_paths): """Add site-packages (and possibly site-python) to sys.path""" sitedirs = [] seen = [] for prefix in PREFIXES: if not prefix or prefix in seen: continue seen.append(prefix) if sys.platform in ('os2emx', 'riscos'): sitedirs.append(os.path.join(prefix, "Lib", "site-packages")) elif sys.platform == 'darwin' and prefix == sys.prefix: sitedirs.append(os.path.join("/Library/Python", sys.version[:3], "site-packages")) 

También creo que el nombre del directorio que tiene site.py (/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6 para mi Mac) debe estar integrado en el código fuente de Python.

La mayoría de las cosas se configuran en el site.py de Python, que se importa automáticamente al iniciar el intérprete (a menos que lo inicie con la opción -S ). Pocos caminos se configuran en el intérprete durante la inicialización (puede averiguar cuál iniciando python con -S ).

Además, algunos marcos (como Django creo) modifican sys.path en el inicio para cumplir con sus requisitos.

El módulo del site tiene una documentación bastante buena, un código fuente comentado e imprime algo de información si lo ejecuta a través del python -m site .

De Learning Python :

sys.path es la ruta de búsqueda del módulo. Python lo configura al inicio del progtwig, fusionando automáticamente el directorio de inicio del archivo de nivel superior (o una cadena vacía para designar el directorio de trabajo actual), cualquier directorio PYTHONPATH, el contenido de cualquier ruta de archivo .pth que haya creado, y el directorios de la biblioteca estándar. El resultado es una lista de cadenas de nombres de directorio que Python busca en cada importación de un nuevo archivo.

site.py es de hecho las respuestas. Quería eliminar las dependencias en el antiguo Python que se instala de forma predeterminada en mi mac. Esto funciona bastante bien, ya que se llama ‘site.py’ cada vez que se inicia el intérprete de python.

Para Mac, agregué manualmente la siguiente línea al final de main () en /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/site.py:

  sys.path = filter (lambda a: not a.startswith('/System'), sys.path) 

El camino tiene estas partes:

  • Rutas del sistema operativo que tienen sus bibliotecas del sistema
  • directorio actual de python a partir de
  • variable ambiental $PYTHONPATH
  • Puede agregar rutas en tiempo de ejecución.

Los caminos no son ignorados. Pero, pueden no ser encontrados y eso no generará un error. sys.path solo se debe agregar, no se debe restar. Django no eliminaría las rutas.

Agregando a la respuesta aceptada y abordando los comentarios que dicen que un módulo no debe eliminar las entradas de sys.path :

Esto es ampliamente cierto, pero hay circunstancias en las que es posible que desee modificar sys.path eliminando entradas. Por ejemplo, y esto es específico de Mac; * Puede haber corolarios de nix / Windows: si crea un Python.framework personalizado para incluirlo en su propio proyecto, es posible que desee ignorar las entradas de sys.path predeterminadas que apuntan al sistema Python.framework .

Tienes unas cuantas opciones:

  1. site.py el site.py , como lo indica @damirv, o

  2. Agregue su propio módulo (o paquete) de personalización del sitio al marco personalizado que logra el mismo resultado final. Como se indica en los comentarios de site.py (para 2.7.6, de todos modos):

    Después de estas manipulaciones de ruta, se intenta importar un módulo llamado sitecustomize, que puede realizar personalizaciones adicionales arbitrarias específicas del sitio. Si esta importación falla con una excepción ImportError, se ignora silenciosamente.

También tenga en cuenta: si se configura PYTHONHOME env var, las bibliotecas estándar se cargarán desde esta ruta en lugar de la predeterminada, como se documenta .

Esta no es una respuesta directa a la pregunta, pero algo que acabo de descubrir causaba que se cargaran las bibliotecas estándar incorrectas, y mis búsquedas me llevan aquí en el camino.

Está utilizando el sistema python /usr/bin/python .

sys.path se establece a partir de los archivos del sistema al inicio de Python.

No toque esos archivos, en particular site.py, porque esto puede perturbar el sistema.

Sin embargo, puede cambiar sys.path dentro de python, en particular, al inicio:

en ~ / .bashrc o ~ / .zshrc:

export PYTHONSTARTUP=~/.pythonrc

en ~ / .pythonrc:

escribe tus cambios a sys.path.

Esos cambios serán solo para ti en shells interactivos.

Para piratear con poco riesgo para el sistema, instale su propia versión de Python y la más reciente.