Python s'efforce vraiment de définir intelligemment sys.path
. La façon dont il est défini peut devenir vraiment compliqué . Le guide suivant est édulcorée, quelque peu incomplète, quelque peu de mal, mais Guide , espérons-utile pour le rang et le fichier programmeur python de ce qui se passe lorsque les chiffres de python ce qu'il faut utiliser comme valeurs initiales de sys.path
,
sys.executable
, sys.exec_prefix
, et sys.prefix
sur une
installation python normale .
Premièrement, python fait de son mieux pour déterminer son emplacement physique réel sur le système de fichiers en fonction de ce que le système d'exploitation lui dit. Si le système d'exploitation dit simplement que "python" est en cours d'exécution, il se trouve dans $ PATH. Il résout tous les liens symboliques. Une fois qu'il a fait cela, le chemin de l'exécutable qu'il trouve est utilisé comme valeur pour sys.executable
, no ifs, ands, or mais.
Ensuite, il détermine les valeurs initiales de sys.exec_prefix
et
sys.prefix
.
S'il y a un fichier appelé pyvenv.cfg
dans le même répertoire que
sys.executable
ou un répertoire en haut, python l'examine. Différents systèmes d'exploitation font des choses différentes avec ce fichier.
L'une des valeurs de ce fichier de configuration que python recherche est l'option de configuration home = <DIRECTORY>
. Python utilisera ce répertoire au lieu du répertoire contenant sys.executable
lorsqu'il définit dynamiquement la valeur initiale de sys.prefix
later. Si le applocal = true
paramètre apparaît dans le
pyvenv.cfg
fichier sous Windows, mais pas le home = <DIRECTORY>
paramètre, il sys.prefix
sera défini sur le répertoire contenant sys.executable
.
Ensuite, la PYTHONHOME
variable d'environnement est examinée. Sous Linux et Mac,
sys.prefix
et sys.exec_prefix
sont définis sur la PYTHONHOME
variable d'environnement, si elle existe, remplaçant tout home = <DIRECTORY>
paramètre dans pyvenv.cfg
. Sous Windows,
sys.prefix
et sys.exec_prefix
est défini sur la PYTHONHOME
variable d'environnement, si elle existe, sauf si un home = <DIRECTORY>
paramètre est présent dans pyvenv.cfg
, qui est utilisé à la place.
Sinon, ceux sys.prefix
- ci et sys.exec_prefix
sont trouvés en marchant en arrière à partir de l'emplacement de sys.executable
, ou du home
répertoire donné par le pyvenv.cfg
cas échéant.
Si le fichier lib/python<version>/dyn-load
se trouve dans ce répertoire ou dans l'un de ses répertoires parents, ce répertoire est défini pour être
sys.exec_prefix
sur Linux ou Mac. Si le fichier
lib/python<version>/os.py
se trouve dans le répertoire ou dans l'un de ses sous-répertoires, ce répertoire est défini pour être sys.prefix
sous Linux, Mac et Windows, avec sys.exec_prefix
la même valeur que
sys.prefix
sous Windows. Cette étape entière est ignorée sous Windows si elle
applocal = true
est définie. Soit le répertoire de sys.executable
est utilisé, soit, s'il home
est défini dans pyvenv.cfg
, il est utilisé à la place pour la valeur initiale de sys.prefix
.
S'il ne peut pas trouver ces fichiers "repères" ou sys.prefix
n'a pas encore été trouvé, alors python définit sys.prefix
une valeur de "repli". Linux et Mac, par exemple, utilisent des valeurs par défaut précompilées comme valeurs de sys.prefix
et sys.exec_prefix
. Windows attend que ce sys.path
soit complètement compris pour définir une valeur de secours pour
sys.prefix
.
Ensuite, (ce que vous attendiez tous), python détermine les valeurs initiales qui doivent être contenues dans sys.path
.
- Le répertoire du script exécuté par python est ajouté
sys.path
. Sous Windows, il s'agit toujours de la chaîne vide, qui indique à python d'utiliser le chemin complet où se trouve le script à la place.
- Le contenu de la variable d'environnement PYTHONPATH, s'il est défini, est ajouté à
sys.path
, sauf si vous êtes sous Windows et applocal
est défini sur true dans pyvenv.cfg
.
- Le chemin du fichier zip, qui se trouve
<prefix>/lib/python35.zip
sur Linux / Mac et
os.path.join(os.dirname(sys.executable), "python.zip")
Windows, est ajouté à sys.path
.
- Si sous Windows et non a
applocal = true
été défini pyvenv.cfg
, le contenu des sous-clés de la clé de registre
HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
est ajouté, le cas échéant.
- Si sous Windows et que no a
applocal = true
été défini dans pyvenv.cfg
, et sys.prefix
n'a pas pu être trouvé, alors le contenu de base de la clé de registre HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
est ajouté, s'il existe;
- Si sous Windows et non a
applocal = true
été défini pyvenv.cfg
, le contenu des sous-clés de la clé de registre
HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
est ajouté, le cas échéant.
- Si sous Windows et que no a
applocal = true
été défini dans pyvenv.cfg
, et sys.prefix
n'a pas pu être trouvé, alors le contenu de base de la clé de registre HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
est ajouté, s'il existe;
- Si sous Windows et que PYTHONPATH n'a pas été défini, le préfixe n'a pas été trouvé et qu'aucune clé de registre n'était présente, la valeur relative à la compilation de PYTHONPATH est ajoutée; sinon, cette étape est ignorée.
- Les chemins dans la macro PYTHONPATH au moment de la compilation sont ajoutés par rapport au fichier trouvé dynamiquement
sys.prefix
.
- Sur Mac et Linux, la valeur de
sys.exec_prefix
est ajoutée. Sous Windows, le répertoire qui a été utilisé (ou aurait été utilisé) pour rechercher dynamiquement sys.prefix
est ajouté.
À ce stade sous Windows, si aucun préfixe n'a été trouvé, python essaiera de le déterminer en recherchant dans tous les répertoires sys.path
les fichiers de repère, comme il a essayé de le faire avec le répertoire de sys.executable
précédemment, jusqu'à ce qu'il trouve quelque chose. Si ce n'est pas le cas, sys.prefix
est laissé vide.
Enfin, après tout cela, Python charge le site
module, ce qui ajoute encore plus de choses à sys.path
:
Il commence par construire jusqu'à quatre répertoires à partir d'une partie de tête et d'une partie de queue. Pour la partie tête, il utilise sys.prefix
et sys.exec_prefix
; les têtes vides sont ignorées. Pour la partie queue, il utilise la chaîne vide puis lib/site-packages
(sous Windows) ou lib/pythonX.Y/site-packages
et puis lib/site-python
(sous Unix et Macintosh). Pour chacune des combinaisons tête-queue distinctes, il voit s'il fait référence à un répertoire existant, et si c'est le cas, l'ajoute à sys.path et inspecte également le chemin nouvellement ajouté pour les fichiers de configuration.