Pregunta ¿De dónde se inicializó sys.path de Python?


¿De dónde se inicializó 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.


76
2018-05-22 13:19


origen


Respuestas:


"Inicializado a partir de la variable de entorno PYTHONPATH, más un valor predeterminado dependiente de la instalación"

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


37
2018-05-22 13:21



Python realmente se esfuerza por establecer inteligentemente sys.path. Como es establecer puede obtener De Verdad  Complicado. La siguiente guía es un aguada, guía algo incompleta, algo incorrecta, pero afortunadamente útil para el programador de python de rango y archivo de lo que sucede cuando Python se da cuenta de qué usar como el valores iniciales de sys.path, sys.executable, sys.exec_prefixy sys.prefix en un normal instalación de python

En primer lugar, Python hace su mejor esfuerzo para descubrir su verdadero físico ubicación en el sistema de archivos en función de lo que dice el sistema operativo eso. Si el SO simplemente dice "python" se está ejecutando, se encuentra en $ PATH. Resuelve cualquier enlace simbólico. Una vez que ha hecho esto, el camino de el ejecutable que encuentra se usa como valor para sys.executable, no si, ands, o peros.

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 arriba, Python lo mira. Diferente Los sistemas operativos hacen cosas diferentes con este archivo.

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

Luego, el PYTHONHOME la variable de entorno es examinada. En Linux y Mac, sys.prefix y sys.exec_prefix están configurados para PYTHONHOME variable de entorno, si existe, reemplazando alguna home = <DIRECTORY> instalándose pyvenv.cfg. En Windows, sys.prefix y sys.exec_prefix está configurado a PYTHONHOME Variable ambiental, si existiera, a no ser que un home = <DIRECTORY> la configuración 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 home directorio dado por pyvenv.cfg Si alguna.

Si el archivo lib/python<version>/dyn-load se encuentra en ese directorio o cualquiera de sus directorios principales, ese directorio está configurado para ser sys.exec_prefix en Linux o Mac. Si el archivo lib/python<version>/os.py se encuentra en el directorio o cualquiera de sus subdirectorios, ese directorio está configurado para ser sys.prefix en Linux, Mac y Windows, con sys.exec_prefix establecido en el mismo valor que sys.prefix en Windows. Este paso completo se omite en Windows si applocal = true Está establecido. O el directorio de sys.executable es usado o, si home está preparado pyvenv.cfg, que se usa en cambio para el valor inicial de sys.prefix.

Si no puede encontrar estos archivos "históricos" o sys.prefix no ha sido encontrado aún, entonces Python establece sys.prefix a un "repliegue" valor. Linux y Mac, por ejemplo, usan valores predeterminados precompilados como valores de sys.prefix y sys.exec_prefix. Windows espera hasta sys.path está completamente resuelto para establecer un valor de retorno para sys.prefix.

Entonces, (lo que todos han estado esperando), python determina los valores iniciales que deben estar contenidos en sys.path.

  1. El directorio de la secuencia de comandos que Python está ejecutando se agrega a sys.path. En Windows, esta es siempre la cadena vacía, que le dice a python use el presente directorio de trabajo en su lugar.
  2. El contenido de la variable de entorno PYTHONPATH, si está establecido, se agrega a sys.path, a no ser que eres en Windows y applocal se establece en verdadero en pyvenv.cfg.
  3. La ruta del archivo zip, que es <prefix>/lib/python35.zip en Linux / Mac y os.path.join(os.dirname(sys.executable), "python.zip") en Windows, se agrega a sys.path.
  4. Si está en Windows y no applocal = true fue puesto en pyvenv.cfg, luego el contenido de las subclaves de la clave de registro HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ se agregan, si hay alguno.
  5. Si está en Windows y no applocal = true fue puesto en pyvenv.cfgy sys.prefix no pudo ser encontrado, entonces el contenido central de la de la clave de registro HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ se agrega, si existe;
  6. Si está en Windows y no applocal = true fue puesto en pyvenv.cfg, luego el contenido de las subclaves de la clave de registro HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\ se agregan, si hay alguno.
  7. Si está en Windows y no applocal = true fue puesto en pyvenv.cfgy sys.prefix no pudo ser encontrado, entonces el contenido central de la de la clave de registro HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ se agrega, si existe;
  8. Si en Windows no se configuró PYTHONPATH, no se encontró el prefijo y no se encontraron claves de registro, entonces el se agrega el valor relativo de compilación de PYTHONPATH; de lo contrario, este paso se ignora.
  9. Las rutas en la macro de tiempo de compilación PYTHONPATH se agregan en relación con las dinámicamente encontradas sys.prefix.
  10. En Mac y Linux, el valor de sys.exec_prefix está agregado. En Windows, el directorio que se usó (o se habría usado) para buscar de forma dinámica sys.prefix es adicional.

En esta etapa en Windows, si no se encontró ningún prefijo, entonces python intentará determinarlo buscando todas los directorios en sys.path para los archivos de referencia, como trató de hacer con el directorio de sys.executable previamente, hasta que encuentre algo. Si no es así, sys.prefix se deja en blanco

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

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


35
2017-07-15 19:19