Pertanyaan Di mana Python sys.path diinisialisasi?


Di mana Python sys.path 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 bertanya-tanya di mana jalan-jalan itu sebelum datangnya PYTHONPATH?


76
2018-05-22 13:19


asal


Jawaban:


"Diinisialisasi dari variabel lingkungan PYTHONPATH, plus default yang tergantung pada pemasangan"

- http://docs.python.org/library/sys.html#sys.path


37
2018-05-22 13:21



Python benar-benar berusaha keras untuk secara cerdas mengatur sys.path. Bagaimana itu set bisa sangat  rumit. Panduan berikut ini diencerkan, panduan yang agak tidak lengkap, agak salah, tapi mudah-mudahan bermanfaat untuk programmer python peringkat-dan-apa yang terjadi ketika python mencari tahu apa yang harus digunakan sebagai nilai awal dari sys.path, sys.executable, sys.exec_prefix, dan sys.prefix pada suatu normal instalasi python.

Pertama, python memiliki level terbaik untuk mengetahui fisik sebenarnya lokasi di filesystem berdasarkan apa yang dikatakan sistem operasi saya t. Jika OS hanya mengatakan "python" sedang berjalan, ia menemukan dirinya dalam $ PATH. Ini menyelesaikan tautan simbolis apa pun. Setelah itu dilakukan, jalannya dieksekusi yang ditemukan digunakan sebagai nilai untuk sys.executable, tidak seandainya, ands, atau tapian.

Selanjutnya, ia menentukan nilai awal untuk sys.exec_prefix dan   sys.prefix.

Jika ada file bernama pyvenv.cfg di direktori yang sama dengan sys.executable atau satu direktori, python melihatnya. Berbeda OS melakukan hal yang berbeda dengan file ini.

Salah satu nilai dalam file konfigurasi ini yang dicari oleh python adalah opsi konfigurasi home = <DIRECTORY>. Python akan menggunakan direktori ini daripada direktori yang berisi sys.executable ketika secara dinamis menetapkan nilai awal sys.prefix kemudian. Jika itu applocal = true pengaturan muncul di pyvenv.cfg file di Windows, tetapi tidak home = <DIRECTORY> pengaturan, kemudian 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 diatur ke PYTHONHOME variabel lingkungan, jika itu ada, menggantikan apa saja home = <DIRECTORY> pengaturan pyvenv.cfg. Di Windows, sys.prefix dan sys.exec_prefix diatur ke PYTHONHOME variabel lingkungan, jika itu ada, kecuali kalau Sebuah home = <DIRECTORY> pengaturan hadir pyvenv.cfg, yang digunakan sebagai gantinya.

Kalau 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 sudah diatur sys.exec_prefix di Linux atau Mac. Jika file lib/python<version>/os.py ditemukan di direktori atau salah satunya subdirektori, direktori itu diatur menjadi sys.prefix di Linux, Mac, dan Windows, dengan sys.exec_prefix set ke nilai yang sama dengan sys.prefix di Windows. Seluruh langkah ini dilompati pada Windows jika applocal = true diatur. Entah direktori dari sys.executable aku s digunakan atau, jika home diatur pyvenv.cfg, yang digunakan sebagai gantinya nilai awal dari sys.prefix.

Jika tidak dapat menemukan file "tengara" ini atau sys.prefix belum ditemukan belum, maka python set sys.prefix ke "fallback" nilai. Linux dan Mac, misalnya, menggunakan default pra-dikompilasi sebagai nilai-nilai dari sys.prefix dan sys.exec_prefix. Windows menunggu sampai sys.path sepenuhnya dipahami untuk menetapkan nilai penggantian untuk sys.prefix.

Kemudian, (apa yang Anda semua telah menunggu,) python menentukan nilai awal yang terkandung dalam sys.path.

  1. Direktori script yang mengeksekusi python ditambahkan sys.path. Pada Windows, ini selalu string kosong, yang memberitahu python untuk gunakan direktori kerja saat ini.
  2. Isi variabel lingkungan PYTHONPATH, jika disetel, ditambahkan ke sys.path, kecuali kalau kamu pada Windows dan applocal diatur ke true di pyvenv.cfg.
  3. Jalur file zip, yang <prefix>/lib/python35.zip di Linux / Mac dan os.path.join(os.dirname(sys.executable), "python.zip") pada Windows, ditambahkan ke sys.path.
  4. Jika di Windows dan tidak applocal = true didirikan pyvenv.cfg, kemudian isi dari subkunci dari kunci registri HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ ditambahkan, jika ada.
  5. Jika di Windows dan tidak applocal = true didirikan pyvenv.cfg, dan sys.prefix tidak dapat ditemukan, maka itu isi inti dari kunci registri HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ ditambahkan, jika ada;
  6. Jika di Windows dan tidak applocal = true didirikan pyvenv.cfg, kemudian isi dari subkunci dari kunci registri HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\ ditambahkan, jika ada.
  7. Jika di Windows dan tidak applocal = true didirikan pyvenv.cfg, dan sys.prefix tidak dapat ditemukan, maka itu isi inti dari kunci registri HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ ditambahkan, jika ada;
  8. Jika pada Windows, dan PYTHONPATH tidak diatur, awalan tidak ditemukan, dan tidak ada kunci registri yang hadir, maka nilai compile-time relatif dari PYTHONPATH ditambahkan; jika tidak, langkah ini diabaikan.
  9. Path di makro waktu compile PYTHONPATH ditambahkan relatif terhadap yang ditemukan secara dinamis sys.prefix.
  10. Di Mac dan Linux, nilai dari sys.exec_prefix telah ditambahkan. Di Windows, direktori yang digunakan (atau akan digunakan) untuk mencari secara dinamis sys.prefix aku s ditambahkan.

Pada tahap ini di Windows, jika tidak ada awalan yang ditemukan, maka python akan berusaha tentukan dengan mencari semua direktori di sys.path untuk file tengara, seperti yang coba dilakukan dengan direktori sys.executable sebelumnya, sampai menemukan sesuatu. Jika tidak, sys.prefix dibiarkan kosong.

Akhirnya, setelah semua ini, Python memuat site modul, yang menambahkan lebih banyak hal lagi sys.path:

Ini dimulai dengan membangun hingga empat direktori dari kepala dan   bagian ekor. Untuk bagian kepala, itu menggunakan sys.prefix dan sys.exec_prefix;   kepala kosong dilewati. Untuk bagian ekor, ia menggunakan string kosong   lalu lib/site-packages (pada Windows) atau lib/pythonX.Y/site-packages   lalu lib/site-python (pada Unix dan Macintosh). Untuk masing-masing   kombinasi head-tail yang berbeda, ia melihat jika itu merujuk pada yang ada   direktori, dan jika demikian, menambahkannya ke sys.path dan juga memeriksa yang baru   menambahkan path untuk file konfigurasi.


35
2017-07-15 19:19