Où est le sys.path Python initialisé à partir?
Question
Où est sys.path Python initialisé à partir?
UPD : Python ajoute quelques pistes avant de PYTHONPATH se référant:
>>> 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 où ces chemins avant de les PythonPath de viennent?
La solution
"Initialisé de la PYTHONPATH variable d'environnement, plus un défaut dépendant de l'installation"
Autres conseils
Python essaie vraiment difficile de mettre intelligemment sys.path
. Comment c'est
ensemble peut obtenir vraiment compliquée . Le guide suivant est édulcorée,
quelque peu incomplète, quelque peu de mal, mais je l'espère Guide-utile
pour le rang et le fichier programmeur python de ce qui se passe quand python
les chiffres sur ce qu'il faut utiliser les valeurs initiales de sys.path
,
sys.executable
, sys.exec_prefix
et sys.prefix
sur normale
installation de python.
Tout d'abord, python fait de son mieux pour comprendre son physique
emplacement sur le système de fichiers basé sur ce que le système d'exploitation dit
il. Si le système d'exploitation dit juste « 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ée comme valeur pour sys.executable
, aucun ifs,
ands ou buts.
Ensuite, il détermine les valeurs initiales pour 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 vers le haut de répertoire, python regarde. Différent
OSes faire des choses différentes avec ce fichier.
L'une des valeurs dans ce fichier de configuration qui ressemble python est
l'option de configuration home = <DIRECTORY>
. Python utilisera ce répertoire au lieu du répertoire contenant sys.executable
quand il définit dynamiquement plus tard, la valeur initiale de sys.prefix
. Si le réglage de applocal = true
apparaît dans la
fichier pyvenv.cfg
sous Windows, mais pas le paramètre home = <DIRECTORY>
,
puis sys.prefix
sera réglé sur le répertoire contenant sys.executable
.
Ensuite, la variable d'environnement PYTHONHOME
est examiné. Sous Linux et Mac,
sys.prefix
et sys.exec_prefix
sont fixés à la variable d'environnement PYTHONHOME
, si
il existe, annule et remplace tout réglage home = <DIRECTORY>
dans pyvenv.cfg
. Sous Windows,
sys.prefix
et sys.exec_prefix
est réglé sur la variable d'environnement PYTHONHOME
,
si elle existe, à moins que un cadre home = <DIRECTORY>
est présent dans pyvenv.cfg
,
qui est utilisé à la place.
Dans le cas contraire, on trouve ces sys.prefix
et sys.exec_prefix
en marchant en arrière
de l'emplacement de sys.executable
, ou le répertoire home
donné par pyvenv.cfg
le cas échéant.
Si le fichier lib/python<version>/dyn-load
se trouve dans ce répertoire
ou l'un de ses répertoires parents, ce répertoire est défini comme être
sys.exec_prefix
sous Linux ou Mac. Si le fichier
lib/python<version>/os.py
est se trouve dans le répertoire ou l'un de ses
les sous-répertoires, ce répertoire est défini à sys.prefix
sous Linux,
Mac et Windows, avec sys.exec_prefix
ensemble à la même valeur que
sys.prefix
sous Windows. Cette étape entière est ignorée sous Windows si
applocal = true
est réglé. Soit le répertoire de sys.executable
est
utilisé ou, si home
est situé dans pyvenv.cfg
, qui est utilisé à la place pour
la valeur initiale de sys.prefix
.
S'il ne peut pas trouver ces fichiers « historiques » ou sys.prefix
n'a pas été
encore trouvé, puis jeux de python sys.prefix
à un « repli »
valeur. Linux et Mac, par exemple, utiliser les valeurs par défaut pré-compilés comme le
les valeurs de sys.prefix
et sys.exec_prefix
. attend Windows
jusqu'à ce que sys.path
est entièrement compris à définir une valeur de repli pour
sys.prefix
.
Alors, (ce que vous avez tous attendu,) python détermine les valeurs initiales
qui doivent être contenus dans sys.path
.
- Le répertoire du script python qui exécute est ajouté à
sys.path
. Sous Windows, ce qui est toujours la chaîne vide, ce qui indique python utiliser le chemin complet où se trouve le script à la place. - Le contenu de la variable d'environnement PYTHONPATH, si ensemble, est ajouté à
sys.path
, à moins que vous êtes sous Windows etapplocal
est définie sur true danspyvenv.cfg
. - Le chemin du fichier zip, qui est
<prefix>/lib/python35.zip
sur Linux / Mac etos.path.join(os.dirname(sys.executable), "python.zip")
sous Windows, est ajouté àsys.path
. - Si sous Windows et ne
applocal = true
a été mis enpyvenv.cfg
, puis le contenu des sous-clés de la clé de RegistreHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
sont ajoutés, le cas échéant. - Si sous Windows et ne
applocal = true
a été mis enpyvenv.cfg
etsys.prefix
n'a pu être trouvée, puis les contenu de base du registre duHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
clé est ajoutée, si elle existe; - Si sous Windows et ne
applocal = true
a été mis enpyvenv.cfg
, puis le contenu des sous-clés de la clé de RegistreHK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
sont ajoutés, le cas échéant. - Si sous Windows et ne
applocal = true
a été mis enpyvenv.cfg
etsys.prefix
n'a pu être trouvée, puis les contenu de base du registre duHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
clé est ajoutée, si elle existe; - Si sur Windows et PYTHONPATH n'a pas été défini, le préfixe n'a pas été trouvé et aucune clé de Registre étaient présents, le La valeur de temps de compilation relative de PYTHONPATH est ajouté; sinon, cette étape est ignorée.
- Chemins dans la compilation PYTHONPATH macro sont ajoutés par rapport au
sys.prefix
dynamiquement trouvé. - Sur Mac et Linux, la valeur de
sys.exec_prefix
est ajouté. Sous Windows, le répertoire qui a été utilisé (ou aurait été utilisé) pour rechercher dynamiquement poursys.prefix
est ajouté.
A ce stade sous Windows, si aucun préfixe a été trouvé, python va essayer de
déterminer en recherchant tous les répertoires sys.path
pour les fichiers historiques,
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 elle ne le fait pas, sys.prefix
est vide.
Enfin, après tout cela, Python charge le module site
, ce qui ajoute des choses encore plus à sys.path
:
Il commence par construire jusqu'à quatre répertoires à partir d'une tête et un une partie de queue. Pour la partie de la tête, il utilise
sys.prefix
etsys.exec_prefix
; têtes vides sont ignorées. Pour la partie de la 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 chacun des distinctes combinaisons queue de tête, il voit si elle fait référence à un existant répertoire, et si oui, ajoute à sys.path et inspecte aussi les nouveaux chemin ajouté pour les fichiers de configuration.