from - python__all__
¿Qué configura sys.path con Python y cuándo? (7)
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
Basándome 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.
Agregando a la respuesta aceptada y abordando los comentarios que dicen que un módulo no debería 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; * pueden existir 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:
site.py
elsite.py
, como @damirv indica, oAgregue 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.
De Learning Python :
sys.path es la ruta de búsqueda del módulo. Python lo configura al inicio del programa, 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.
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 quitaría las rutas.
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.
La mayoría de las cosas se configuran en 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 documentation bastante buena, un código fuente comentado e imprime algo de información si lo ejecuta a través del python -m site
.
También tenga en cuenta: si se establece la PYTHONHOME
, las bibliotecas estándar se cargarán desde esta ruta en lugar de la predeterminada, como se documented .
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.
site.py es de hecho las respuestas. Quería eliminar cualquier dependencia 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)