Skąd jest inicjalizowany plik sys.path języka Python?
UPD : Python dodaje kilka ścieżek przed odwołaniem się do 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']
Moja PYTHONPATH to:
PYTHONPATH=c:\testdir
Zastanawiam się, skąd pochodzą te ścieżki przed PYTHONPATH?
Python naprawdę bardzo się stara, aby inteligentnie ustawić
sys.path
. Sposób ustawienia może być naprawdę skomplikowany . Poniższy przewodnik jest okrojoną, nieco-niekompletny, nieco-źle, ale mam nadzieję, użyteczny przewodnik dla szeregowych plik python programisty, co się dzieje, gdy dane python, co do wykorzystania jako wartości początkowych osys.path
,sys.executable
,sys.exec_prefix
, isys.prefix
w normalnej instalacji Pythona.Po pierwsze, python robi wszystko, co w jego mocy, aby ustalić rzeczywistą fizyczną lokalizację w systemie plików na podstawie tego, co powie mu system operacyjny. Jeśli system operacyjny mówi tylko, że „python” jest uruchomiony, znajduje się w $ PATH. Rozwiązuje wszelkie dowiązania symboliczne. Gdy to zrobi, ścieżka do znalezionego pliku wykonywalnego jest używana jako wartość for
sys.executable
, no ifs, ands lub buts.Następnie określa początkowe wartości dla
sys.exec_prefix
isys.prefix
.Jeśli istnieje plik wywołany
pyvenv.cfg
w tym samym katalogu cosys.executable
lub o jeden wyżej, Python go przegląda. Różne systemy operacyjne robią różne rzeczy z tym plikiem.Jedną z wartości w tym pliku konfiguracyjnym, której szuka Python, jest opcja konfiguracji
home = <DIRECTORY>
. Python użyje tego katalogu zamiast katalogu zawierającego,sys.executable
gdy dynamicznie ustawi początkową wartośćsys.prefix
później. Jeśliapplocal = true
ustawienie pojawia się wpyvenv.cfg
pliku w systemie Windows, ale nie jest tohome = <DIRECTORY>
ustawienie,sys.prefix
zostanie ustawione na katalog zawierającysys.executable
.Następnie
PYTHONHOME
sprawdzana jest zmienna środowiskowa. W systemach Linux i Macsys.prefix
isys.exec_prefix
są ustawione naPYTHONHOME
zmienną środowiskową, jeśli istnieje, zastępując wszelkiehome = <DIRECTORY>
ustawienia wpyvenv.cfg
. W systemie Windowssys.prefix
isys.exec_prefix
jest ustawiony wPYTHONHOME
zmiennej środowiskowej, jeśli istnieje, chybahome = <DIRECTORY>
ustawienie jest obecny wpyvenv.cfg
, który jest używany zamiast.W przeciwnym razie te
sys.prefix
isys.exec_prefix
można znaleźć, przechodząc wstecz od lokalizacjisys.executable
lubhome
katalogu podanego przez,pyvenv.cfg
jeśli istnieje.Jeśli plik
lib/python<version>/dyn-load
zostanie znaleziony w tym katalogu lub w dowolnym z jego katalogów nadrzędnych, będzie to katalogsys.exec_prefix
w systemie Linux lub Mac. Jeśli pliklib/python<version>/os.py
zostanie znaleziony w katalogu lub w dowolnym z jego podkatalogów, ten katalog jest ustawionysys.prefix
na system Linux, Mac i Windows, zsys.exec_prefix
ustawioną taką samą wartością jaksys.prefix
w systemie Windows. Cały ten krok jest pomijany w systemie Windows, jeśliapplocal = true
jest ustawiony.sys.executable
Używany jest katalog of lub, jeślihome
jest ustawiony wpyvenv.cfg
, używany jest zamiast niego jako wartość początkowasys.prefix
.Jeśli nie może znaleźć tych plików „punktów orientacyjnych” lub
sys.prefix
nie został jeszcze znaleziony, wówczas Python ustawiasys.prefix
wartość „rezerwową”. Na przykład Linux i Mac używają wstępnie skompilowanych wartości domyślnych jako wartościsys.prefix
isys.exec_prefix
. System Windows czeka, ażsys.path
zostanie w pełni skonfigurowany, aby ustawić wartość rezerwową dlasys.prefix
.Następnie (na co wszyscy czekaliście) python określa początkowe wartości, które mają być zawarte
sys.path
.sys.path
. W systemie Windows jest to zawsze pusty ciąg, który mówi Pythonowi, aby zamiast tego używał pełnej ścieżki, w której znajduje się skrypt.sys.path
, chyba że jesteś w systemie Windows iapplocal
jest ustawiona na true wpyvenv.cfg
.<prefix>/lib/python35.zip
w systemie Linux / Mac ios.path.join(os.dirname(sys.executable), "python.zip")
Windows, jest dodawana dosys.path
.applocal = true
ustawiono niepyvenv.cfg
, zawartość podkluczy klucza rejestruHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
jest dodawana, jeśli istnieje.applocal = true
został ustawiony wpyvenv.cfg
, isys.prefix
nie można znaleźć, wówczas zawartość podstawowych Spośród klucza rejestruHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
dodaje, jeśli istnieje;applocal = true
ustawiono niepyvenv.cfg
, zawartość podkluczy klucza rejestruHK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
jest dodawana, jeśli istnieje.applocal = true
został ustawiony wpyvenv.cfg
, isys.prefix
nie można znaleźć, wówczas zawartość podstawowych Spośród klucza rejestruHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
dodaje, jeśli istnieje;sys.prefix
.sys.exec_prefix
dodana. W systemie Windowssys.prefix
dodawany jest katalog, który był używany (lub byłby używany) do wyszukiwania dynamicznego .Na tym etapie w systemie Windows, jeśli nie zostanie znaleziony żaden prefiks, python spróbuje go określić, przeszukując wszystkie katalogi w
sys.path
poszukiwaniu plików punktów orientacyjnych, tak jak próbował zrobić z wcześniejszym katalogiemsys.executable
, aż coś znajdzie. Jeśli tak niesys.prefix
jest, pozostaje puste.Wreszcie, po tym wszystkim, Python ładuje
site
moduł, który dodaje jeszcze więcej rzeczy dosys.path
:źródło
sys.executable
może to być dowiązanie symboliczne lub w rzeczywistości może to być wszystko, jeśliargv[0]
zawiera ukośniki. Rzeczywista ścieżka do pliku wykonywalnego (zexecv(path, argv)
wywołania) nie jest używana.sys.path
dotyczący systemu Windows 10: zawsze otrzymuję pełną ścieżkę katalogu skryptów jako sys.path [0] (nie cwd ''). Powinieneś być w stanie wykonać coś takiegopython some\other\path\than\cwd\main.py
site-packages
mają.pth
i.egg-link
przyrostki.