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 de sys.path
,
sys.executable
, sys.exec_prefix
, y sys.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
y
sys.prefix
.
Si hay un archivo llamado pyvenv.cfg
en el mismo directorio
sys.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 contiene sys.executable
cuando establece dinámicamente el valor inicial de sys.prefix
later. Si la applocal = true
configuración aparece en el
pyvenv.cfg
archivo en Windows, pero no la home = <DIRECTORY>
configuración, sys.prefix
se establecerá en el directorio que contiene sys.executable
.
A continuación, PYTHONHOME
se examina la variable de entorno. En Linux y Mac,
sys.prefix
y sys.exec_prefix
se establecen en la PYTHONHOME
variable de entorno, si existe, reemplazando cualquier home = <DIRECTORY>
configuración en pyvenv.cfg
. En Windows,
sys.prefix
y sys.exec_prefix
se establece en la PYTHONHOME
variable de entorno, si existe, a menos que haya una home = <DIRECTORY>
configuración 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 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 estar
sys.exec_prefix
en Linux o Mac. Si el archivo
lib/python<version>/os.py
se encuentra en el directorio o en cualquiera de sus subdirectorios, ese directorio está configurado para estar sys.prefix
en Linux, Mac y Windows, con sys.exec_prefix
el mismo valor que
sys.prefix
en Windows. Este paso completo se omite en Windows si
applocal = true
está configurado. Se sys.executable
utiliza el directorio de o, si home
se establece en pyvenv.cfg
, se utiliza en su lugar para el valor inicial de sys.prefix
.
Si no puede encontrar estos archivos "emblemáticos" o sys.prefix
aún no los ha encontrado, entonces Python establece sys.prefix
un valor de "respaldo". Linux y Mac, por ejemplo, usan valores predeterminados precompilados como valores de sys.prefix
y sys.exec_prefix
. Windows espera hasta que sys.path
esté completamente calculado para establecer un valor de respaldo
sys.prefix
.
Luego, (lo que todos han estado esperando), Python determina los valores iniciales que deben incluirse sys.path
.
- Se agrega el directorio del script en el que se está ejecutando Python
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.
- El contenido de la variable de entorno PYTHONPATH, si se establece, se agrega a
sys.path
, a menos que esté en Windows y applocal
esté establecido en verdadero en pyvenv.cfg
.
- La ruta del archivo zip, que está
<prefix>/lib/python35.zip
en Linux / Mac y
os.path.join(os.dirname(sys.executable), "python.zip")
en Windows, se agrega a sys.path
.
- Si en Windows y no
applocal = true
se configuró no pyvenv.cfg
, entonces HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
se agrega el contenido de las subclaves de la clave de registro
, si corresponde.
- Si en Windows y no
applocal = true
se configuró pyvenv.cfg
y sys.prefix
no se pudo encontrar, entonces se agrega el contenido principal de la clave de registro HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
, si existe;
- Si en Windows y no
applocal = true
se configuró no pyvenv.cfg
, entonces HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
se agrega el contenido de las subclaves de la clave de registro
, si corresponde.
- Si en Windows y no
applocal = true
se configuró pyvenv.cfg
y sys.prefix
no se pudo encontrar, entonces se agrega el contenido principal de la clave de registro HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
, si existe;
- Si en Windows y no se configuró PYTHONPATH, no se encontró el prefijo y no había claves de registro, se agrega el valor relativo en tiempo de compilación de PYTHONPATH; de lo contrario, este paso se ignora.
- Las rutas de la macro en tiempo de compilación PYTHONPATH se agregan en relación con la que se encuentra dinámicamente
sys.prefix
.
- En Mac y Linux,
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 de sys.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 a sys.path
:
Comienza construyendo hasta cuatro directorios a partir de una parte inicial y otra final. Para la parte de la cabeza, usa sys.prefix
y sys.exec_prefix
; se saltan cabezas vacías. Para la parte final, 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 head-tail, 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.