¿Desde dónde se inicia sys.path de Python?

¿Desde dónde se inicia sys.path de Python?

UPD : Python está agregando algunas rutas antes de referirse a PYTHONPATH:

>>> import sys >>> from pprint import pprint as p >>> p(sys.path) ['', 'C:\\Python25\\lib\\site-packages\\setuptools-0.6c9-py2.5.egg', 'C:\\Python25\\lib\\site-packages\\orbited-0.7.8-py2.5.egg', 'C:\\Python25\\lib\\site-packages\\morbid-0.8.6.1-py2.5.egg', 'C:\\Python25\\lib\\site-packages\\demjson-1.4-py2.5.egg', 'C:\\Python25\\lib\\site-packages\\stomper-0.2.2-py2.5.egg', 'C:\\Python25\\lib\\site-packages\\uuid-1.30-py2.5.egg', 'C:\\Python25\\lib\\site-packages\\stompservice-0.1.0-py2.5.egg', 'C:\\Python25\\lib\\site-packages\\cherrypy-3.0.1-py2.5.egg', 'C:\\Python25\\lib\\site-packages\\pyorbited-0.2.2-py2.5.egg', 'C:\\Python25\\lib\\site-packages\\flup-1.0.1-py2.5.egg', 'C:\\Python25\\lib\\site-packages\\wsgilog-0.1-py2.5.egg', 'c:\\testdir', 'C:\\Windows\\system32\\python25.zip', 'C:\\Python25\\DLLs', 'C:\\Python25\\lib', 'C:\\Python25\\lib\\plat-win', 'C:\\Python25\\lib\\lib-tk', 'C:\\Python25', 'C:\\Python25\\lib\\site-packages', 'C:\\Python25\\lib\\site-packages\\PIL', 'C:\\Python25\\lib\\site-packages\\win32', 'C:\\Python25\\lib\\site-packages\\win32\\lib', 'C:\\Python25\\lib\\site-packages\\Pythonwin'] 

Mi PYTHONPATH es:

  PYTHONPATH=c:\testdir 

Me pregunto de dónde vienen esos caminos antes de los de PYTHONPATH.

“Inicializado desde la variable de entorno PYTHONPATH, más un valor predeterminado dependiente de la instalación”

http://docs.python.org/library/sys.html#sys.path

Python realmente intenta configurar de forma inteligente sys.path . Cómo se establece puede llegar a ser realmente complicado . La siguiente guía es una guía diluida, algo incompleta, algo incorrecta, pero con suerte útil para el progtwigdor de Python de clasificación y archivo de lo que sucede cuando python sys.path qué usar como los valores iniciales de sys.path . sys.executable , sys.exec_prefix , y sys.prefix en una instalación normal de Python.

Primero, python hace su mejor nivel para determinar su ubicación física real en el sistema de archivos según lo que el sistema operativo le diga. Si el sistema operativo simplemente dice que “python” se está ejecutando, se encuentra en $ PATH. Resuelve cualquier enlace simbólico. Una vez que haya hecho esto, la ruta del ejecutable que encuentra se usa como el valor de sys.executable , sin ifs, ands o buts.

A continuación, determina los valores iniciales para sys.exec_prefix y sys.prefix .

Si hay un archivo llamado pyvenv.cfg en el mismo directorio que sys.executable o un directorio superior, python lo mira. Diferentes sistemas operativos hacen diferentes cosas con este archivo.

Uno de los valores en este archivo de configuración que Python busca es la opción de configuración home = . Python usará este directorio en lugar del directorio que contiene sys.executable cuando sys.executable dinámicamente el valor inicial de sys.prefix más adelante. Si la applocal = true aparece en el archivo pyvenv.cfg en Windows, pero no en la configuración de home = , entonces sys.prefix se establecerá en el directorio que contiene sys.executable .

A continuación, se PYTHONHOME la variable de entorno PYTHONHOME . En Linux y Mac, sys.prefix y sys.exec_prefix se establecen en la variable de entorno PYTHONHOME , si existe, sustituyendo cualquier configuración de home = en pyvenv.cfg . En Windows, sys.prefix y sys.exec_prefix se establece en la variable de entorno PYTHONHOME , si existe, a menos que la configuración de home = esté presente en pyvenv.cfg , que se usa en su lugar.

De lo contrario, estos sys.prefix y sys.exec_prefix se encuentran caminando hacia atrás desde la ubicación de sys.executable , o el directorio de home proporcionado por pyvenv.cfg si lo hay.

Si el archivo lib/python/dyn-load se encuentra en ese directorio o en cualquiera de sus directorios principales, ese directorio está configurado para ser sys.exec_prefix en Linux o Mac. Si el archivo lib/python/os.py se encuentra en el directorio o en cualquiera de sus subdirectorios, ese directorio se configura como sys.prefix en Linux, Mac y Windows, con sys.exec_prefix configurado en el mismo Valor como sys.prefix en Windows. Este paso completo se omite en Windows si se establece applocal = true . Se usa el directorio de sys.executable o, si home está configurado en pyvenv.cfg , se usa para el valor inicial de sys.prefix .

Si no puede encontrar estos archivos “hito” o sys.prefix aún no se ha encontrado, entonces python establece sys.prefix en un valor de “reserva”. Linux y Mac, por ejemplo, utilizan valores predeterminados precomstackdos como los valores de sys.prefix y sys.exec_prefix . Windows espera hasta que sys.path esté completamente configurado para establecer un valor de reserva para sys.prefix .

Luego, (lo que todos han estado esperando), python determina los valores iniciales que se deben contener en sys.path .

  1. El directorio del script que Python está ejecutando se agrega a sys.path . En Windows, esta es siempre la cadena vacía, que le dice a Python que use la ruta completa donde se ubica la secuencia de comandos.
  2. El contenido de la variable de entorno PYTHONPATH, si se establece, se agrega a sys.path , a menos que esté en Windows y applocal esté establecido en verdadero en pyvenv.cfg .
  3. La ruta del archivo zip, que es /lib/python35.zip en Linux / os.path.join(os.dirname(sys.executable), "python.zip") en Windows, se agrega a sys.path
  4. Si en Windows y no se estableció applocal = true en pyvenv.cfg , entonces se pyvenv.cfg el contenido de las subclaves de la clave de registro HK_CURRENT_USER\Software\Python\PythonCore\\PythonPath\ , si corresponde.
  5. Si en Windows y no se estableció applocal = true en pyvenv.cfg , y no se pudo encontrar pyvenv.cfg , se sys.prefix el contenido principal de la clave de registro HK_CURRENT_USER\Software\Python\PythonCore\\PythonPath\ , si existiera;
  6. Si en Windows y no se estableció applocal = true en pyvenv.cfg , se pyvenv.cfg el contenido de las subclaves de la clave de registro HK_LOCAL_MACHINE\Software\Python\PythonCore\\PythonPath\ , si corresponde.
  7. Si en Windows y no se estableció applocal = true en pyvenv.cfg , y no se pudo encontrar pyvenv.cfg , se sys.prefix el contenido principal de la clave de registro HK_CURRENT_USER\Software\Python\PythonCore\\PythonPath\ , si existiera;
  8. Si en Windows, y PYTHONPATH no se estableció, no se encontró el prefijo y no hubo claves de registro presentes, entonces se agrega el valor de tiempo de comstackción relativo de PYTHONPATH; De lo contrario, este paso se ignora.
  9. Las rutas en la macro de tiempo de comstackción PYTHONPATH se agregan en relación con el sys.prefix encontrado sys.prefix .
  10. En Mac y Linux, se agrega el valor de sys.exec_prefix . En Windows, se agrega el directorio que se usó (o se habría usado) para buscar de forma dinámica sys.prefix .

En esta etapa en Windows, si no se encontró ningún prefijo, entonces Python intentará determinarlo buscando en los directorios en sys.path para los archivos de puntos de referencia, como intentó hacerlo con el directorio de sys.executable anteriormente, hasta que encuentre alguna cosa. Si no lo hace, sys.prefix se deja en blanco.

Finalmente, después de todo esto, Python carga el módulo del site , que agrega cosas aún más a sys.path :

Comienza por construir hasta cuatro directorios a partir de una cabeza y una parte de la cola. Para la parte principal, usa sys.prefix y sys.exec_prefix ; Las cabezas vacías se saltan. Para la parte de cola, usa la cadena vacía y luego lib/site-packages (en Windows) o lib/pythonX.Y/site-packages y luego lib/site-python (en Unix y Macintosh). Para cada una de las distintas combinaciones de cabeza y cola, ve si se refiere a un directorio existente, y si es así, lo agrega a sys.path y también inspecciona la ruta recién agregada para los archivos de configuración.