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"
¿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
.
- 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. - El contenido de la variable de entorno PYTHONPATH, si está establecido, se agrega a
sys.path
, a menos que esté en Windows yapplocal
esté configurado como verdadero enpyvenv.cfg
. - La ruta del archivo comprimido, que es
<prefix>/lib/python35.zip
en Linux / Mac yos.path.join(os.dirname(sys.executable), "python.zip")
en Windows, se agrega asys.path
- Si en Windows y no
applocal = true
se configuró enpyvenv.cfg
, sepyvenv.cfg
el contenido de las subclaves de la clave de registroHK_CURRENT_USER/Software/Python/PythonCore/<DLLVersion>/PythonPath/
, si corresponde. - Si en Windows y no
applocal = true
se configuró enpyvenv.cfg
y no se pudo encontrarpyvenv.cfg
, sesys.prefix
los contenidos principales de la clave de registroHK_CURRENT_USER/Software/Python/PythonCore/<DLLVersion>/PythonPath/
, si existiera; - Si en Windows y no
applocal = true
se configuró enpyvenv.cfg
, sepyvenv.cfg
el contenido de las subclaves de la clave de registroHK_LOCAL_MACHINE/Software/Python/PythonCore/<DLLVersion>/PythonPath/
, si corresponde. - Si en Windows y no
applocal = true
se configuró enpyvenv.cfg
y no se pudo encontrarpyvenv.cfg
, sesys.prefix
los contenidos principales de la clave de registroHK_CURRENT_USER/Software/Python/PythonCore/<DLLVersion>/PythonPath/
, si existiera; - 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.
- Las rutas en la macro de tiempo de compilación PYTHONPATH se agregan en relación con el
sys.prefix
encontradosys.prefix
. - 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 parasys.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
ysys.exec_prefix
; las cabezas vacías se saltan. Para la parte de cola, usa la cadena vacía y luegolib/site-packages
(en Windows) olib/pythonX.Y/site-packages
y luegolib/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.