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.prefix
pada
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_prefix
dan
sys.prefix
.
Jika ada file yang dipanggil pyvenv.cfg
di direktori yang sama dengan
sys.executable
atau 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.prefix
nanti. Jika applocal = true
pengaturan muncul di
pyvenv.cfg
file pada Windows, tetapi tidak home = <DIRECTORY>
pengaturan, maka sys.prefix
akan diatur ke direktori yang berisi sys.executable
.
Selanjutnya, PYTHONHOME
variabel lingkungan diperiksa. Di Linux dan Mac,
sys.prefix
dan sys.exec_prefix
disetel ke PYTHONHOME
variabel lingkungan, jika ada, menggantikanhome = <DIRECTORY>
setelan apa pun di pyvenv.cfg
. Di Windows,
sys.prefix
dan sys.exec_prefix
diatur ke PYTHONHOME
variabel lingkungan, jika ada, kecuali ada home = <DIRECTORY>
pengaturan pyvenv.cfg
, yang digunakan sebagai gantinya.
Jika tidak, ini sys.prefix
dan sys.exec_prefix
ditemukan dengan berjalan mundur dari lokasi sys.executable
, atau home
direktori yang diberikan oleh pyvenv.cfg
jika ada.
Jika file lib/python<version>/dyn-load
ditemukan di direktori itu atau salah satu direktori induknya, direktori itu disetel ke
sys.exec_prefix
Linux atau Mac. Jika file
lib/python<version>/os.py
ditemukan di direktori atau subdirektorinya, direktori tersebut disetel ke sys.prefix
Linux, Mac, dan Windows, dengan sys.exec_prefix
nilai yang sama seperti
sys.prefix
di Windows. Seluruh langkah ini dilewati di Windows jika
applocal = true
disetel. Entah direktori sys.executable
yang digunakan atau, jika home
disetel pyvenv.cfg
, yang digunakan sebagai gantinya untuk nilai awal sys.prefix
.
Jika tidak dapat menemukan file "tengara" ini atau sys.prefix
belum ditemukan, maka python disetel sys.prefix
ke nilai "fallback". Linux dan Mac, misalnya, menggunakan default yang telah dikompilasi sebelumnya sebagai nilai dari sys.prefix
dan sys.exec_prefix
. Windows menunggu hingga sys.path
benar-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 applocal
disetel ke true di pyvenv.cfg
.
- Jalur file zip, yang ada
<prefix>/lib/python35.zip
di 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 = true
yang 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 = true
yang ditetapkan pyvenv.cfg
, dan sys.prefix
tidak 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 = true
yang 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 = true
yang ditetapkan pyvenv.cfg
, dan sys.prefix
tidak 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_prefix
ditambahkan. Pada Windows, direktori yang digunakan (atau akan digunakan) untuk mencari secara dinamis sys.prefix
ditambahkan.
Pada tahap ini di Windows, jika tidak ada prefiks yang ditemukan, maka python akan mencoba menentukannya dengan mencari semua direktori di sys.path
untuk file landmark, seperti yang coba dilakukan dengan direktori sys.executable
sebelumnya, hingga menemukan sesuatu. Jika tidak, sys.prefix
dikosongkan.
Akhirnya, setelah semua ini, Python memuat site
modul, 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.prefix
dan 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.