¿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.prefixen 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_prefixysys.prefix.Si hay un archivo llamado
pyvenv.cfgen el mismo directoriosys.executableo 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.executablecuando establece dinámicamente el valor inicial desys.prefixlater. Si laapplocal = trueconfiguración aparece en elpyvenv.cfgarchivo en Windows, pero no lahome = <DIRECTORY>configuración,sys.prefixse establecerá en el directorio que contienesys.executable.A continuación,
PYTHONHOMEse examina la variable de entorno. En Linux y Mac,sys.prefixysys.exec_prefixse establecen en laPYTHONHOMEvariable de entorno, si existe, reemplazando cualquierhome = <DIRECTORY>configuración enpyvenv.cfg. En Windows,sys.prefixysys.exec_prefixse establece en laPYTHONHOMEvariable 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.prefixysys.exec_prefixse encuentran caminando hacia atrás desde la ubicación desys.executable, o elhomedirectorio dado por,pyvenv.cfgsi lo hubiera.Si el archivo
lib/python<version>/dyn-loadse encuentra en ese directorio o en cualquiera de sus directorios principales, ese directorio está configurado para estarsys.exec_prefixen Linux o Mac. Si el archivolib/python<version>/os.pyse encuentra en el directorio o en cualquiera de sus subdirectorios, ese directorio está configurado para estarsys.prefixen Linux, Mac y Windows, consys.exec_prefixel mismo valor quesys.prefixen Windows. Este paso completo se omite en Windows siapplocal = trueestá configurado. Sesys.executableutiliza el directorio de o, sihomese establece enpyvenv.cfg, se utiliza en su lugar para el valor inicial desys.prefix.Si no puede encontrar estos archivos "emblemáticos" o
sys.prefixaún no los ha encontrado, entonces Python establecesys.prefixun valor de "respaldo". Linux y Mac, por ejemplo, usan valores predeterminados precompilados como valores desys.prefixysys.exec_prefix. Windows espera hasta quesys.pathesté 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 yapplocalesté establecido en verdadero enpyvenv.cfg.<prefix>/lib/python35.zipen Linux / Mac yos.path.join(os.dirname(sys.executable), "python.zip")en Windows, se agrega asys.path.applocal = truese 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 = truese configurópyvenv.cfgysys.prefixno se pudo encontrar, entonces se agrega el contenido principal de la clave de registroHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\, si existe;applocal = truese 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 = truese configurópyvenv.cfgysys.prefixno 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_prefixse agrega el valor de . En Windows,sys.prefixse 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.pathlos archivos de referencia, como intentó hacer con el directorio desys.executableanteriormente, hasta que encuentre algo. Si no es así,sys.prefixse deja en blanco.Finalmente, después de todo esto, Python carga el
sitemódulo, que agrega cosas aún más asys.path:fuente
sys.executablepuede 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.pathWindows 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.pysite-packageshave.pthy.egg-linksufijos.