tutorial modules creating create all python path sys

creating - python using modules



¿De dónde se inicializó sys.path de Python? (2)

"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

¿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.


Python realmente se esfuerza por establecer inteligentemente sys.path . Cómo se establece puede ser really complicated . La siguiente guía es una guía diluida, algo incompleta, algo errónea, pero con suerte útil para el programador de python de rango y archivo de lo que ocurre 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.

En primer lugar, python hace todo lo posible para averiguar su ubicación física real en el sistema de archivos en función de lo que el sistema operativo le dice. Si el SO simplemente dice "python" se está ejecutando, se encuentra en $ PATH. Resuelve cualquier enlace simbólico. Una vez que ha hecho esto, la ruta del ejecutable que encuentra se usa como el valor para sys.executable , sin ifs, 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 examina. Los diferentes sistemas operativos hacen cosas diferentes con este archivo.

Uno de los valores en este archivo de configuración que python busca es la opción de configuración home = <DIRECTORY> . Python utilizará este directorio en lugar del directorio que contiene sys.executable cuando establece 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 home = <DIRECTORY> , 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 configuran en la variable de entorno PYTHONHOME , si existe, reemplazando cualquier ajuste home = <DIRECTORY> en pyvenv.cfg . En Windows, sys.prefix y sys.exec_prefix se configuran en la variable de entorno PYTHONHOME , si existe, a menos que esté presente una configuración home = <DIRECTORY> en pyvenv.cfg , que se utiliza en su lugar.

De lo contrario, estos sys.prefix y sys.exec_prefix se encuentran retrocediendo desde la ubicación de sys.executable , o el directorio de home proporcionado por pyvenv.cfg caso.

Si el archivo lib/python<version>/dyn-load se encuentra en ese directorio o cualquiera de sus directorios principales, ese directorio se configurará 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 como sys.prefix en Windows. Este paso completo se omite en Windows si se establece applocal = true . O sys.executable se usa el directorio de sys.executable o, si se establece pyvenv.cfg en pyvenv.cfg , se usa en su lugar para el valor inicial de sys.prefix .

Si no puede encontrar estos archivos "históricos" o sys.prefix aún no se ha encontrado, entonces python establece sys.prefix en un valor de " sys.prefix ". Linux y Mac, por ejemplo, usan valores predeterminados precompilados como los valores de sys.prefix y sys.exec_prefix . Windows espera hasta que sys.path esté totalmente resuelto para establecer un valor de sys.prefix para sys.prefix .

Luego, (lo que todos han estado esperando), python determina los valores iniciales que deben contenerse 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 que use el presente directorio de trabajo.
  2. El contenido de la variable de entorno PYTHONPATH, si está establecido, se agrega a sys.path , a menos que esté en Windows y applocal esté configurado como verdadero en pyvenv.cfg .
  3. La ruta del archivo comprimido, 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 en Windows y no applocal = true se configuró en pyvenv.cfg , se pyvenv.cfg el contenido de las subclaves de la clave de registro HK_CURRENT_USER/Software/Python/PythonCore/<DLLVersion>/PythonPath/ , si corresponde.
  5. Si en Windows y no applocal = true se configuró en pyvenv.cfg y no se pudo encontrar pyvenv.cfg , se sys.prefix los contenidos principales de la clave de registro HK_CURRENT_USER/Software/Python/PythonCore/<DLLVersion>/PythonPath/ , si existiera;
  6. Si en Windows y no applocal = true se configuró en pyvenv.cfg , se pyvenv.cfg el contenido de las subclaves de la clave de registro HK_LOCAL_MACHINE/Software/Python/PythonCore/<DLLVersion>/PythonPath/ , si corresponde.
  7. Si en Windows y no applocal = true se configuró en pyvenv.cfg y no se pudo encontrar pyvenv.cfg , se sys.prefix los contenidos principales de la clave de registro HK_CURRENT_USER/Software/Python/PythonCore/<DLLVersion>/PythonPath/ , si existiera;
  8. Si en Windows no se configuró PYTHONPATH, no se encontró el prefijo y no se encontraron claves de registro, se agrega el valor relativo de tiempo 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 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 dinámicamente para sys.prefix .

En esta etapa en Windows, si no se encontró ningún prefijo, entonces python intentará determinarlo buscando todos los directorios en sys.path para los archivos de referencia, como lo intentó hacer 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 construyendo hasta cuatro directorios desde una cabeza y una parte trasera. 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 cabeza-cola, se 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.