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.prefixw 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_prefixi
sys.prefix.
Jeśli istnieje plik wywołany pyvenv.cfgw tym samym katalogu co
sys.executablelub 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.prefixpóźniej. Jeśli applocal = trueustawienie pojawia się w
pyvenv.cfgpliku w systemie Windows, ale nie jest to home = <DIRECTORY>ustawienie, sys.prefixzostanie ustawione na katalog zawierający sys.executable.
Następnie PYTHONHOMEsprawdzana jest zmienna środowiskowa. W systemach Linux i Mac
sys.prefixi sys.exec_prefixsą ustawione na PYTHONHOMEzmienną środowiskową, jeśli istnieje, zastępując wszelkie home = <DIRECTORY>ustawienia w pyvenv.cfg. W systemie Windows
sys.prefixi sys.exec_prefixjest ustawiony w PYTHONHOMEzmiennej środowiskowej, jeśli istnieje, chybahome = <DIRECTORY> ustawienie jest obecny w pyvenv.cfg, który jest używany zamiast.
W przeciwnym razie te sys.prefixi sys.exec_prefixmożna znaleźć, przechodząc wstecz od lokalizacji sys.executablelub homekatalogu podanego przez, pyvenv.cfgjeśli istnieje.
Jeśli plik lib/python<version>/dyn-loadzostanie znaleziony w tym katalogu lub w dowolnym z jego katalogów nadrzędnych, będzie to katalog
sys.exec_prefixw systemie Linux lub Mac. Jeśli plik
lib/python<version>/os.pyzostanie znaleziony w katalogu lub w dowolnym z jego podkatalogów, ten katalog jest ustawiony sys.prefixna system Linux, Mac i Windows, z sys.exec_prefixustawioną taką samą wartością jak
sys.prefixw systemie Windows. Cały ten krok jest pomijany w systemie Windows, jeśli
applocal = truejest ustawiony. sys.executableUżywany jest katalog of lub, jeśli homejest 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.prefixnie został jeszcze znaleziony, wówczas Python ustawia sys.prefixwartość „rezerwową”. Na przykład Linux i Mac używają wstępnie skompilowanych wartości domyślnych jako wartości sys.prefixi sys.exec_prefix. System Windows czeka, aż sys.pathzostanie 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 applocaljest ustawiona na true w pyvenv.cfg.
- Ścieżka do pliku zip, która znajduje się
<prefix>/lib/python35.zipw 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 = trueustawiono 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 = truezostał ustawiony w pyvenv.cfg, i sys.prefixnie 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 = trueustawiono 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 = truezostał ustawiony w pyvenv.cfg, i sys.prefixnie 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_prefixdodana. W systemie Windows sys.prefixdodawany 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.pathposzukiwaniu plików punktów orientacyjnych, tak jak próbował zrobić z wcześniejszym katalogiem sys.executable, aż coś znajdzie. Jeśli tak nie sys.prefixjest, pozostaje puste.
Wreszcie, po tym wszystkim, Python ładuje sitemoduł, 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.prefixi 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.