Dari mana sys.path Python diinisialisasi?
UPD : Python menambahkan beberapa jalur sebelum merujuk ke 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']
PYTHONPATH saya adalah:
PYTHONPATH=c:\testdir
Saya ingin tahu dari mana asal jalur sebelum jalur PYTHONPATH?
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 darisys.path
,sys.executable
,sys.exec_prefix
, dansys.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
dansys.prefix
.Jika ada file yang dipanggil
pyvenv.cfg
di direktori yang sama dengansys.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 berisisys.executable
ketika ia secara dinamis menetapkan nilai awalsys.prefix
nanti. Jikaapplocal = true
pengaturan muncul dipyvenv.cfg
file pada Windows, tetapi tidakhome = <DIRECTORY>
pengaturan, makasys.prefix
akan diatur ke direktori yang berisisys.executable
.Selanjutnya,
PYTHONHOME
variabel lingkungan diperiksa. Di Linux dan Mac,sys.prefix
dansys.exec_prefix
disetel kePYTHONHOME
variabel lingkungan, jika ada, menggantikanhome = <DIRECTORY>
setelan apa pun dipyvenv.cfg
. Di Windows,sys.prefix
dansys.exec_prefix
diatur kePYTHONHOME
variabel lingkungan, jika ada, kecuali adahome = <DIRECTORY>
pengaturanpyvenv.cfg
, yang digunakan sebagai gantinya.Jika tidak, ini
sys.prefix
dansys.exec_prefix
ditemukan dengan berjalan mundur dari lokasisys.executable
, atauhome
direktori yang diberikan olehpyvenv.cfg
jika ada.Jika file
lib/python<version>/dyn-load
ditemukan di direktori itu atau salah satu direktori induknya, direktori itu disetel kesys.exec_prefix
Linux atau Mac. Jika filelib/python<version>/os.py
ditemukan di direktori atau subdirektorinya, direktori tersebut disetel kesys.prefix
Linux, Mac, dan Windows, dengansys.exec_prefix
nilai yang sama sepertisys.prefix
di Windows. Seluruh langkah ini dilewati di Windows jikaapplocal = true
disetel. Entah direktorisys.executable
yang digunakan atau, jikahome
disetelpyvenv.cfg
, yang digunakan sebagai gantinya untuk nilai awalsys.prefix
.Jika tidak dapat menemukan file "tengara" ini atau
sys.prefix
belum ditemukan, maka python disetelsys.prefix
ke nilai "fallback". Linux dan Mac, misalnya, menggunakan default yang telah dikompilasi sebelumnya sebagai nilai darisys.prefix
dansys.exec_prefix
. Windows menunggu hinggasys.path
benar-benar diketahui untuk menetapkan nilai fallbacksys.prefix
.Kemudian, (apa yang Anda semua tunggu-tunggu,) python menentukan nilai awal yang akan dimasukkan
sys.path
.sys.path
. Di Windows, ini selalu berupa string kosong, yang memberi tahu python untuk menggunakan jalur lengkap tempat skrip berada.sys.path
, kecuali Anda menggunakan Windows danapplocal
disetel ke true dipyvenv.cfg
.<prefix>/lib/python35.zip
di Linux / Mac danos.path.join(os.dirname(sys.executable), "python.zip")
di Windows, ditambahkan kesys.path
.applocal = true
yang disetelpyvenv.cfg
, konten subkunci dari kunci registriHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
akan ditambahkan, jika ada.applocal = true
yang ditetapkanpyvenv.cfg
, dansys.prefix
tidak dapat ditemukan, maka konten inti dari kunci registriHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
akan ditambahkan, jika ada;applocal = true
yang disetelpyvenv.cfg
, konten subkunci dari kunci registriHK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
akan ditambahkan, jika ada.applocal = true
yang ditetapkanpyvenv.cfg
, dansys.prefix
tidak dapat ditemukan, maka konten inti dari kunci registriHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
akan ditambahkan, jika ada;sys.prefix
.sys.exec_prefix
ditambahkan. Pada Windows, direktori yang digunakan (atau akan digunakan) untuk mencari secara dinamissys.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 direktorisys.executable
sebelumnya, hingga menemukan sesuatu. Jika tidak,sys.prefix
dikosongkan.Akhirnya, setelah semua ini, Python memuat
site
modul, yang menambahkan hal-hal lebih jauh kesys.path
:sumber
sys.executable
bisa berupa symlink atau sebenarnya bisa apa saja jikaargv[0]
mengandung garis miring. Sebenarnya jalan ke executable (dariexecv(path, argv)
panggilan) tidak digunakan.sys.path
di windows 10: Saya selalu mendapatkan path lengkap dari dir skrip saya sebagai sys.path [0] (bukan cwd ''). Anda harus dapat menjalankan sesuatu sepertipython some\other\path\than\cwd\main.py
site-packages
memiliki.pth
dan.egg-link
akhiran.