D'où est initialisé sys.path de Python?
UPD : Python ajoute quelques 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 avant ceux de PYTHONPATH?
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 desys.path
,sys.executable
,sys.exec_prefix
, etsys.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
etsys.prefix
.S'il y a un fichier appelé
pyvenv.cfg
dans le même répertoire quesys.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 contenantsys.executable
lorsqu'il définit dynamiquement la valeur initiale desys.prefix
later. Si leapplocal = true
paramètre apparaît dans lepyvenv.cfg
fichier sous Windows, mais pas lehome = <DIRECTORY>
paramètre, ilsys.prefix
sera défini sur le répertoire contenantsys.executable
.Ensuite, la
PYTHONHOME
variable d'environnement est examinée. Sous Linux et Mac,sys.prefix
etsys.exec_prefix
sont définis sur laPYTHONHOME
variable d'environnement, si elle existe, remplaçant touthome = <DIRECTORY>
paramètre danspyvenv.cfg
. Sous Windows,sys.prefix
etsys.exec_prefix
est défini sur laPYTHONHOME
variable d'environnement, si elle existe, sauf si unhome = <DIRECTORY>
paramètre est présent danspyvenv.cfg
, qui est utilisé à la place.Sinon, ceux
sys.prefix
- ci etsys.exec_prefix
sont trouvés en marchant en arrière à partir de l'emplacement desys.executable
, ou duhome
répertoire donné par lepyvenv.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 êtresys.exec_prefix
sur Linux ou Mac. Si le fichierlib/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 êtresys.prefix
sous Linux, Mac et Windows, avecsys.exec_prefix
la même valeur quesys.prefix
sous Windows. Cette étape entière est ignorée sous Windows si elleapplocal = true
est définie. Soit le répertoire desys.executable
est utilisé, soit, s'ilhome
est défini danspyvenv.cfg
, il est utilisé à la place pour la valeur initiale desys.prefix
.S'il ne peut pas trouver ces fichiers "repères" ou
sys.prefix
n'a pas encore été trouvé, alors python définitsys.prefix
une valeur de "repli". Linux et Mac, par exemple, utilisent des valeurs par défaut précompilées comme valeurs desys.prefix
etsys.exec_prefix
. Windows attend que cesys.path
soit complètement compris pour définir une valeur de secours poursys.prefix
.Ensuite, (ce que vous attendiez tous), python détermine les valeurs initiales qui doivent être contenues 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 à la place.sys.path
, sauf si vous êtes sous Windows etapplocal
est défini sur true danspyvenv.cfg
.<prefix>/lib/python35.zip
sur Linux / Mac etos.path.join(os.dirname(sys.executable), "python.zip")
Windows, est ajouté àsys.path
.applocal = true
été définipyvenv.cfg
, le contenu des sous-clés de la clé de registreHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
est ajouté, le cas échéant.applocal = true
été défini danspyvenv.cfg
, etsys.prefix
n'a pas pu être trouvé, alors le contenu de base de la clé de registreHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
est ajouté, s'il existe;applocal = true
été définipyvenv.cfg
, le contenu des sous-clés de la clé de registreHK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
est ajouté, le cas échéant.applocal = true
été défini danspyvenv.cfg
, etsys.prefix
n'a pas pu être trouvé, alors le contenu de base de la clé de registreHK_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 qui a été utilisé (ou aurait été utilisé) pour rechercher dynamiquementsys.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 desys.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
:la source
sys.executable
peut s'agir d'un lien symbolique ou en fait de n'importe quoi s'ilargv[0]
contient des barres obliques. Le chemin d' accès réel à l'exécutable (à partir de l'execv(path, argv)
appel) n'est pas utilisé.sys.path
Windows 10: j'obtiens toujours le chemin complet de mon répertoire de script comme sys.path [0] (pas cwd ''). Vous devriez pouvoir exécuter quelque chose commepython some\other\path\than\cwd\main.py
site-packages
ont.pth
et les.egg-link
suffixes.