D'où est initialisé sys.path de Python?
UPD : Python ajoute des chemins avant de faire référence à 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']
Mon PYTHONPATH est:
PYTHONPATH=c:\testdir
Je me demande d'où viennent ces chemins antérieurs à ceux de PYTHONPATH?
"Initialisé à partir de la variable d'environnement PYTHONPATH, plus une valeur par défaut dépendante de l'installation"
Python essaie vraiment de définir intelligemment sys.path
. Comment cela est mis peut obtenir vraimentcompliqué . Le guide suivant est un guide dilué, quelque peu incomplet, quelque peu faux, mais utile, à l’avenir, pour le python) programmeur de ce qui se passe lorsque python indique ce qu'il faut utiliser comme valeurs initiales de sys.path
, sys.executable
, sys.exec_prefix
, et sys.prefix
sur une installation normale python.
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 indique. Si le système d'exploitation dit simplement que "python" est en cours d'exécution, il se trouvera dans $ PATH. Il résout tous les liens symboliques. Une fois que cela est fait, le chemin de l'exécutable trouvé est utilisé comme valeur pour sys.executable
, Pas de ifs, ni de mais.
Ensuite, il détermine les valeurs initiales pour sys.exec_prefix
Et sys.prefix
.
Si un fichier appelé pyvenv.cfg
Se trouve dans le même répertoire que sys.executable
Ou dans un répertoire supérieur, python l'examine. Différents systèmes d'exploitation agissent différemment 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 à la place du répertoire contenant sys.executable
lorsqu’il définit dynamiquement la valeur initiale de sys.prefix
ultérieurement. Si le paramètre applocal = true
apparaît dans le fichier pyvenv.cfg
sous Windows, mais pas le paramètre home = <DIRECTORY>
, Alors sys.prefix
Sera défini sur le répertoire contenant sys.executable
.
Ensuite, la variable d’environnement PYTHONHOME
est examinée. Sous Linux et Mac, sys.prefix
Et sys.exec_prefix
Sont définis sur la variable d’environnement PYTHONHOME
, si elle existe, remplaçant tout paramètre home = <DIRECTORY>
dans pyvenv.cfg
. Sous Windows, sys.prefix
Et sys.exec_prefix
Sont définis sur la variable d’environnement PYTHONHOME
, si elle existe, , sauf si un paramètre home = <DIRECTORY>
est présent dans pyvenv.cfg
, qui est utilisé à la place.
Sinon, ces sys.prefix
Et sys.exec_prefix
Sont trouvés en remontant à partir de l'emplacement de sys.executable
, Ou du répertoire home
donné par pyvenv.cfg
Si tout.
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 configuré pour être sys.exec_prefix
Sous 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, il est défini sur sys.prefix
Sous Linux, Mac et Windows, avec sys.exec_prefix
Sur la même valeur que sys.prefix
sous Windows. Toute cette étape est ignorée sous Windows si applocal = true
Est défini. Le répertoire de sys.executable
Est utilisé ou, si home
est défini dans pyvenv.cfg
, Il est utilisé à la place pour la valeur initiale de sys.prefix
.
S'il ne trouve pas ces fichiers "historiques" ou si sys.prefix
N'a pas encore été trouvé, python définit sys.prefix
Sur une valeur "de secours". Linux et Mac, par exemple, utilisent des valeurs pré-compilées comme valeurs de sys.prefix
Et sys.exec_prefix
. Windows attend que sys.path
Soit complètement défini pour définir une valeur de repli pour sys.prefix
.
Ensuite, (ce que vous attendiez tous) python détermine les valeurs initiales devant figurer dans sys.path
.
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.sys.path
, sauf si vous êtes sous Windows et applocal
est défini sur true dans pyvenv.cfg
.<prefix>/lib/python35.Zip
Sous Linux/Mac et os.path.join(os.dirname(sys.executable), "python.Zip")
sous Windows, est ajouté à sys.path
.applocal = true
N'est pas défini dans 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.applocal = true
N'était pas défini dans pyvenv.cfg
Et que sys.prefix
Était introuvable, le contenu de base de la clé de registre HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
est ajouté, s'il existe;applocal = true
N'est pas défini dans 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.applocal = true
N'était pas défini dans pyvenv.cfg
Et que sys.prefix
Était introuvable, le contenu de base de la clé de registre HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
est ajouté, s'il existe;sys.prefix
.sys.exec_prefix
Est ajoutée. Sous Windows, le répertoire utilisé (ou l'aurait été) pour rechercher dynamiquement sys.prefix
Est ajouté.A ce stade de Windows, si aucun préfixe n’a été trouvé, python va essayer de le déterminer en cherchant tous les les répertoires dans sys.path
pour les fichiers de repère, comme cela avait été tenté auparavant avec le répertoire de sys.executable
, jusqu'à ce qu'il trouve quelque chose. Sinon, sys.prefix
est laissé vide. .
Enfin, après tout cela, Python charge le module site
, qui ajoute encore des éléments à sys.path
:
Il commence par construire jusqu'à quatre répertoires à partir d'une tête et d'une queue. Pour la partie tête, il utilise
sys.prefix
Etsys.exec_prefix
; les têtes vides sont ignorées. Pour la partie queue, il utilise la chaîne vide, puislib/site-packages
(Sous Windows) oulib/pythonX.Y/site-packages
, Puislib/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, le cas échéant, l'ajoute à sys.path et examine également le chemin nouvellement ajouté pour les fichiers de configuration.