¿Desde dónde se inicializa sys.path de Python?
UPD : Python está agregando algunas rutas antes de hacer referencia 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 configurar inteligentemente
sys.path
. La forma en que se establece puede ser realmente complicada . La siguiente guía es un poco incompleto, guía aguada, un poco-mal, pero es de esperar-útil para la pitón programador rango y archivo de lo que sucede cuando las cifras del pitón lo usen como los valores iniciales desys.path
,sys.executable
,sys.exec_prefix
, ysys.prefix
en una instalación normal de Python.Primero, Python hace todo lo posible para averiguar su ubicación física real en el sistema de archivos basándose en lo que le dice el sistema operativo. Si el sistema operativo simplemente dice que "python" se está ejecutando, se encuentra en $ PATH. Resuelve los enlaces simbólicos. Una vez hecho esto, la ruta del ejecutable que encuentra se usa como el valor de
sys.executable
, no ifs, ands o buts.A continuación, determina los valores iniciales de
sys.exec_prefix
ysys.prefix
.Si hay un archivo llamado
pyvenv.cfg
en el mismo directoriosys.executable
o un directorio arriba, Python lo mira. Los diferentes 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 contienesys.executable
cuando establece dinámicamente el valor inicial desys.prefix
later. Si laapplocal = true
configuración aparece en elpyvenv.cfg
archivo en Windows, pero no lahome = <DIRECTORY>
configuración,sys.prefix
se establecerá en el directorio que contienesys.executable
.A continuación,
PYTHONHOME
se examina la variable de entorno. En Linux y Mac,sys.prefix
ysys.exec_prefix
se establecen en laPYTHONHOME
variable de entorno, si existe, reemplazando cualquierhome = <DIRECTORY>
configuración enpyvenv.cfg
. En Windows,sys.prefix
ysys.exec_prefix
se establece en laPYTHONHOME
variable de entorno, si existe, a menos que haya unahome = <DIRECTORY>
configuración presente enpyvenv.cfg
, que se usa en su lugar.De lo contrario, estos
sys.prefix
ysys.exec_prefix
se encuentran caminando hacia atrás desde la ubicación desys.executable
, o elhome
directorio dado por,pyvenv.cfg
si lo hubiera.Si el archivo
lib/python<version>/dyn-load
se encuentra en ese directorio o en cualquiera de sus directorios principales, ese directorio está configurado para estarsys.exec_prefix
en Linux o Mac. Si el archivolib/python<version>/os.py
se encuentra en el directorio o en cualquiera de sus subdirectorios, ese directorio está configurado para estarsys.prefix
en Linux, Mac y Windows, consys.exec_prefix
el mismo valor quesys.prefix
en Windows. Este paso completo se omite en Windows siapplocal = true
está configurado. Sesys.executable
utiliza el directorio de o, sihome
se establece enpyvenv.cfg
, se utiliza en su lugar para el valor inicial desys.prefix
.Si no puede encontrar estos archivos "emblemáticos" o
sys.prefix
aún no los ha encontrado, entonces Python establecesys.prefix
un valor de "respaldo". Linux y Mac, por ejemplo, usan valores predeterminados precompilados como valores desys.prefix
ysys.exec_prefix
. Windows espera hasta quesys.path
esté completamente calculado para establecer un valor de respaldosys.prefix
.Luego, (lo que todos han estado esperando), Python determina los valores iniciales que deben incluirse
sys.path
.sys.path
. En Windows, esta es siempre la cadena vacía, que le dice a Python que use la ruta completa donde se encuentra el script.sys.path
, a menos que esté en Windows yapplocal
esté establecido en verdadero enpyvenv.cfg
.<prefix>/lib/python35.zip
en Linux / Mac yos.path.join(os.dirname(sys.executable), "python.zip")
en Windows, se agrega asys.path
.applocal = true
se configuró nopyvenv.cfg
, entoncesHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
se agrega el contenido de las subclaves de la clave de registro , si corresponde.applocal = true
se configurópyvenv.cfg
ysys.prefix
no se pudo encontrar, entonces se agrega el contenido principal de la clave de registroHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
, si existe;applocal = true
se configuró nopyvenv.cfg
, entoncesHK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
se agrega el contenido de las subclaves de la clave de registro , si corresponde.applocal = true
se configurópyvenv.cfg
ysys.prefix
no se pudo encontrar, entonces se agrega el contenido principal de la clave de registroHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
, si existe;sys.prefix
.sys.exec_prefix
se agrega el valor de . En Windows,sys.prefix
se agrega el directorio que se usó (o se habría usado) para buscar dinámicamente .En esta etapa en Windows, si no se encontró ningún prefijo, Python intentará determinarlo buscando en todos los directorios
sys.path
los archivos de referencia, como intentó hacer con el directorio desys.executable
anteriormente, 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 asys.path
:fuente
sys.executable
puede ser un enlace simbólico o en realidad puede ser cualquier cosa siargv[0]
contiene barras. No se utiliza la ruta real al ejecutable (desde laexecv(path, argv)
llamada).sys.path
Windows 10: siempre obtengo la ruta completa de mi directorio de script como sys.path [0] (no cwd ''). Debería poder ejecutar algo comopython some\other\path\than\cwd\main.py
site-packages
have.pth
y.egg-link
sufijos.