Python benar-benar berusaha keras untuk mengatur dengan cerdas sys.path. Bagaimana ini diatur bisa menjadi sangat rumit . Panduan berikut adalah, agak-tidak lengkap, agak-salah, tapi mudah-mudahan-berguna panduan encer untuk peringkat-dan-file python programmer dari apa yang terjadi ketika tokoh python tahu apa yang harus digunakan sebagai nilai awal dari sys.path,
sys.executable, sys.exec_prefix, dan sys.prefixpada
instalasi python normal .
Pertama, python melakukan level terbaiknya untuk mengetahui lokasi fisik sebenarnya pada sistem file berdasarkan apa yang diberitahukan oleh sistem operasi. Jika OS hanya mengatakan "python" sedang berjalan, ia menemukan dirinya di $ PATH. Ini menyelesaikan tautan simbolis apa pun. Setelah melakukan ini, jalur eksekusi yang ditemukannya digunakan sebagai nilai untuk sys.executable, no ifs, ands, or buts.
Selanjutnya, ini menentukan nilai awal untuk sys.exec_prefixdan
sys.prefix.
Jika ada file yang dipanggil pyvenv.cfgdi direktori yang sama dengan
sys.executableatau satu direktori ke atas, python akan melihatnya. OS yang berbeda melakukan hal yang berbeda dengan file ini.
Salah satu nilai dalam file konfigurasi yang dicari python adalah opsi konfigurasi home = <DIRECTORY>. Python akan menggunakan direktori ini dan bukan direktori yang berisi sys.executable
ketika ia secara dinamis menetapkan nilai awal sys.prefixnanti. Jika applocal = truepengaturan muncul di
pyvenv.cfgfile pada Windows, tetapi tidak home = <DIRECTORY>pengaturan, maka sys.prefixakan diatur ke direktori yang berisi sys.executable.
Selanjutnya, PYTHONHOMEvariabel lingkungan diperiksa. Di Linux dan Mac,
sys.prefixdan sys.exec_prefixdisetel ke PYTHONHOMEvariabel lingkungan, jika ada, menggantikanhome = <DIRECTORY> setelan apa pun di pyvenv.cfg. Di Windows,
sys.prefixdan sys.exec_prefixdiatur ke PYTHONHOMEvariabel lingkungan, jika ada, kecuali ada home = <DIRECTORY>pengaturan pyvenv.cfg, yang digunakan sebagai gantinya.
Jika tidak, ini sys.prefixdan sys.exec_prefixditemukan dengan berjalan mundur dari lokasi sys.executable, atau homedirektori yang diberikan oleh pyvenv.cfgjika ada.
Jika file lib/python<version>/dyn-loadditemukan di direktori itu atau salah satu direktori induknya, direktori itu disetel ke
sys.exec_prefixLinux atau Mac. Jika file
lib/python<version>/os.pyditemukan di direktori atau subdirektorinya, direktori tersebut disetel ke sys.prefixLinux, Mac, dan Windows, dengan sys.exec_prefixnilai yang sama seperti
sys.prefixdi Windows. Seluruh langkah ini dilewati di Windows jika
applocal = truedisetel. Entah direktori sys.executableyang digunakan atau, jika homedisetel pyvenv.cfg, yang digunakan sebagai gantinya untuk nilai awal sys.prefix.
Jika tidak dapat menemukan file "tengara" ini atau sys.prefixbelum ditemukan, maka python disetel sys.prefixke nilai "fallback". Linux dan Mac, misalnya, menggunakan default yang telah dikompilasi sebelumnya sebagai nilai dari sys.prefixdan sys.exec_prefix. Windows menunggu hingga sys.pathbenar-benar diketahui untuk menetapkan nilai fallback
sys.prefix.
Kemudian, (apa yang Anda semua tunggu-tunggu,) python menentukan nilai awal yang akan dimasukkan sys.path.
- Direktori skrip yang sedang dieksekusi python ditambahkan
sys.path. Di Windows, ini selalu berupa string kosong, yang memberi tahu python untuk menggunakan jalur lengkap tempat skrip berada.
- Konten variabel lingkungan PYTHONPATH, jika disetel, ditambahkan ke
sys.path, kecuali Anda menggunakan Windows dan applocaldisetel ke true di pyvenv.cfg.
- Jalur file zip, yang ada
<prefix>/lib/python35.zipdi Linux / Mac dan
os.path.join(os.dirname(sys.executable), "python.zip")di Windows, ditambahkan ke sys.path.
- Jika di Windows dan tidak ada
applocal = trueyang disetel pyvenv.cfg, konten subkunci dari kunci registri
HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\akan ditambahkan, jika ada.
- Jika di Windows dan tidak ada
applocal = trueyang ditetapkan pyvenv.cfg, dan sys.prefixtidak dapat ditemukan, maka konten inti dari kunci registri HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\akan ditambahkan, jika ada;
- Jika di Windows dan tidak ada
applocal = trueyang disetel pyvenv.cfg, konten subkunci dari kunci registri
HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\akan ditambahkan, jika ada.
- Jika di Windows dan tidak ada
applocal = trueyang ditetapkan pyvenv.cfg, dan sys.prefixtidak dapat ditemukan, maka konten inti dari kunci registri HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\akan ditambahkan, jika ada;
- Jika di Windows, dan PYTHONPATH tidak disetel, awalan tidak ditemukan, dan tidak ada kunci registri yang ada, maka nilai waktu kompilasi relatif PYTHONPATH akan ditambahkan; jika tidak, langkah ini akan diabaikan.
- Jalur di makro waktu kompilasi PYTHONPATH ditambahkan relatif ke yang ditemukan secara dinamis
sys.prefix.
- Di Mac dan Linux, nilai
sys.exec_prefixditambahkan. Pada Windows, direktori yang digunakan (atau akan digunakan) untuk mencari secara dinamis sys.prefixditambahkan.
Pada tahap ini di Windows, jika tidak ada prefiks yang ditemukan, maka python akan mencoba menentukannya dengan mencari semua direktori di sys.pathuntuk file landmark, seperti yang coba dilakukan dengan direktori sys.executablesebelumnya, hingga menemukan sesuatu. Jika tidak, sys.prefixdikosongkan.
Akhirnya, setelah semua ini, Python memuat sitemodul, yang menambahkan hal-hal lebih jauh ke sys.path:
Ini dimulai dengan membangun hingga empat direktori dari bagian head dan tail. Untuk bagian kepala menggunakan sys.prefixdan sys.exec_prefix; kepala kosong dilewati. Untuk bagian ekor, menggunakan string kosong lalu lib/site-packages(di Windows) atau lib/pythonX.Y/site-packages
kemudian lib/site-python(di Unix dan Macintosh). Untuk setiap kombinasi head-tail yang berbeda, ia melihat apakah itu merujuk ke direktori yang ada, dan jika demikian, menambahkannya ke sys.path dan juga memeriksa jalur yang baru ditambahkan untuk file konfigurasi.