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 o sys.path
,
sys.executable
, sys.exec_prefix
, i sys.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
i
sys.prefix
.
Jeśli istnieje plik wywołany pyvenv.cfg
w tym samym katalogu co
sys.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śli applocal = true
ustawienie pojawia się w
pyvenv.cfg
pliku w systemie Windows, ale nie jest to home = <DIRECTORY>
ustawienie, sys.prefix
zostanie ustawione na katalog zawierający sys.executable
.
Następnie PYTHONHOME
sprawdzana jest zmienna środowiskowa. W systemach Linux i Mac
sys.prefix
i sys.exec_prefix
są ustawione na PYTHONHOME
zmienną środowiskową, jeśli istnieje, zastępując wszelkie home = <DIRECTORY>
ustawienia w pyvenv.cfg
. W systemie Windows
sys.prefix
i sys.exec_prefix
jest ustawiony w PYTHONHOME
zmiennej środowiskowej, jeśli istnieje, chybahome = <DIRECTORY>
ustawienie jest obecny w pyvenv.cfg
, który jest używany zamiast.
W przeciwnym razie te sys.prefix
i sys.exec_prefix
można znaleźć, przechodząc wstecz od lokalizacji sys.executable
lub home
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 katalog
sys.exec_prefix
w systemie Linux lub Mac. Jeśli plik
lib/python<version>/os.py
zostanie znaleziony w katalogu lub w dowolnym z jego podkatalogów, ten katalog jest ustawiony sys.prefix
na system Linux, Mac i Windows, z sys.exec_prefix
ustawioną taką samą wartością jak
sys.prefix
w systemie Windows. Cały ten krok jest pomijany w systemie Windows, jeśli
applocal = true
jest ustawiony. sys.executable
Używany jest katalog of lub, jeśli home
jest ustawiony w pyvenv.cfg
, używany jest zamiast niego jako wartość początkowa sys.prefix
.
Jeśli nie może znaleźć tych plików „punktów orientacyjnych” lub sys.prefix
nie został jeszcze znaleziony, wówczas Python ustawia sys.prefix
wartość „rezerwową”. Na przykład Linux i Mac używają wstępnie skompilowanych wartości domyślnych jako wartości sys.prefix
i sys.exec_prefix
. System Windows czeka, aż sys.path
zostanie w pełni skonfigurowany, aby ustawić wartość rezerwową dla
sys.prefix
.
Następnie (na co wszyscy czekaliście) python określa początkowe wartości, które mają być zawarte sys.path
.
- Katalog skryptu, który wykonuje python, jest dodawany do
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.
- Zawartość zmiennej środowiskowej PYTHONPATH, jeśli jest ustawiona, jest dodawana do
sys.path
, chyba że jesteś w systemie Windows i applocal
jest ustawiona na true w pyvenv.cfg
.
- Ścieżka do pliku zip, która znajduje się
<prefix>/lib/python35.zip
w systemie Linux / Mac i
os.path.join(os.dirname(sys.executable), "python.zip")
Windows, jest dodawana do sys.path
.
- Jeśli w systemie Windows
applocal = true
ustawiono nie pyvenv.cfg
, zawartość podkluczy klucza rejestru
HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
jest dodawana, jeśli istnieje.
- Jeśli w systemie Windows i nie
applocal = true
został ustawiony w pyvenv.cfg
, i sys.prefix
nie można znaleźć, wówczas zawartość podstawowych Spośród klucza rejestru HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
dodaje, jeśli istnieje;
- Jeśli w systemie Windows
applocal = true
ustawiono nie pyvenv.cfg
, zawartość podkluczy klucza rejestru
HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
jest dodawana, jeśli istnieje.
- Jeśli w systemie Windows i nie
applocal = true
został ustawiony w pyvenv.cfg
, i sys.prefix
nie można znaleźć, wówczas zawartość podstawowych Spośród klucza rejestru HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
dodaje, jeśli istnieje;
- Jeśli w systemie Windows i PYTHONPATH nie zostało ustawione, przedrostek nie został znaleziony i nie było żadnych kluczy rejestru, to dodawana jest względna wartość czasu kompilacji PYTHONPATH; w przeciwnym razie ten krok jest ignorowany.
- Ścieżki w makrze PYTHONPATH używanym w czasie kompilacji są dodawane względem pliku znalezionego dynamicznie
sys.prefix
.
- W systemach Mac i Linux wartość
sys.exec_prefix
dodana. W systemie Windows sys.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 katalogiem sys.executable
, aż coś znajdzie. Jeśli tak nie sys.prefix
jest, pozostaje puste.
Wreszcie, po tym wszystkim, Python ładuje site
moduł, który dodaje jeszcze więcej rzeczy do sys.path
:
Rozpoczyna się od skonstruowania do czterech katalogów z części głównej i części końcowej. W części głowy używa sys.prefix
i sys.exec_prefix
; puste głowy są pomijane. W części końcowej używa pustego ciągu, a następnie lib/site-packages
(w systemie Windows) lub lib/pythonX.Y/site-packages
i następnie lib/site-python
(w systemach Unix i Macintosh). Dla każdej z różnych kombinacji head-tail sprawdza, czy odwołuje się do istniejącego katalogu, a jeśli tak, dodaje go do sys.path, a także sprawdza nowo dodaną ścieżkę w poszukiwaniu plików konfiguracyjnych.