Pernahkah Anda berpikir tentang bagaimana perpustakaan lingkungan virtual bekerja di Python? Dalam artikel ini, saya mengusulkan untuk berkenalan dengan konsep utama yang digunakan semua perpustakaan untuk lingkungan, seperti virtualenv, virtualenvwrapper, conda, pipenv.
Awalnya, dalam Python tidak ada kemampuan bawaan untuk membuat lingkungan, dan fitur ini diimplementasikan sebagai peretasan. Ternyata, semua perpustakaan didasarkan pada fitur interpreter python yang sangat sederhana.
Ketika Python memulai interpreter, ia mulai mencari direktori dengan modul (paket-situs). Pencarian dimulai dengan direktori induk mengenai lokasi fisik dari interpreter executable (python.exe). Jika folder modul tidak ditemukan, maka Python naik satu tingkat lebih tinggi dan melakukannya hingga direktori root tercapai. Untuk memahami bahwa ini adalah direktori dengan modul, Python mencari modul os, yang harus ada dalam file os.py dan diperlukan agar python berfungsi.
Mari kita bayangkan bahwa juru bahasa kita terletak di
/usr/dev/lang/bin/python
. Maka jalur pencarian akan terlihat seperti ini:
/usr/dev/lang/lib/python3.7/os.py /usr/dev/lib/python3.7/os.py /usr/lib/python3.7/os.py /lib/python3.7/os.py
Seperti yang Anda lihat, Python menambahkan awalan khusus (
lib/python$VERSION/os.py
) ke jalur kami. Segera setelah penerjemah menemukan kecocokan pertama (keberadaan file os.py), ia mengubah
sys.prefix
dan
sys.exec_prefix
ke jalur ini (dengan awalan dihapus). Jika karena alasan tertentu tidak ada kecocokan yang ditemukan, maka jalur standar digunakan, yang dikompilasi ke dalam interpreter.
Sekarang mari kita lihat bagaimana salah satu perpustakaan tertua dan paling terkenal, virtualenv, melakukannya.
user@arb:/usr/home/test
Setelah eksekusi, itu membuat direktori tambahan:
user@arb:/usr/home/test/ENV
Seperti yang Anda lihat, lingkungan virtual dibuat dengan menyalin biner Python ke folder lokal (ENV / bin / python). Kami juga dapat memperhatikan bahwa folder induk berisi
tautan simbolis ke file pustaka standar python. Kami tidak dapat membuat tautan simbolis ke file yang dapat dieksekusi, karena penerjemah masih akan mengganti nama ke jalur yang sebenarnya.
Sekarang mari kita aktifkan lingkungan kita:
user@arb:/usr/home/test
Perintah ini mengubah variabel lingkungan $ PATH sehingga perintah
python
menunjuk ke versi lokal kami dari python. Ini dicapai dengan mengganti lintasan lokal folder bin pada awal baris $ PATH sehingga lintasan lokal didahulukan dari semua lintasan di sebelah kanan.
export "/usr/home/test/ENV/bin:$PATH" echo $PATH
Jika Anda menjalankan skrip dari lingkungan ini, skrip akan dieksekusi menggunakan biner di
/usr/home/test/ENV/bin/python
. Penerjemah akan menggunakan jalur ini sebagai titik awal untuk menemukan modul. Dalam kasus kami, modul-modul perpustakaan standar akan ditemukan di path
/usr/home/test/ENV/lib/python3.7/
.
Ini adalah retasan utama, berkat semua pustaka untuk bekerja dengan lingkungan virtual bekerja.
Perbaikan dalam Python 3
Dimulai dengan versi Python 3.3, standar baru telah muncul, disebut sebagai
PEP 405 , yang memperkenalkan mekanisme baru untuk lingkungan yang ringan.
PEP ini menambahkan langkah ekstra untuk proses pencarian. Jika Anda membuat
pyenv.cfg
konfigurasi
pyenv.cfg
, maka alih-alih menyalin biner Python dan semua modulnya, Anda bisa dengan mudah menunjukkan lokasinya di konfigurasi ini.
Fitur ini secara aktif digunakan oleh modul
venv standar, yang muncul dalam Python 3.
user@arb:/usr/home/test2
user@arb:/usr/home/test2
Berkat konfigurasi ini, alih-alih menyalin biner, venv hanya membuat tautan ke sana. Jika parameter
include-system-site-packages
diubah menjadi
true
, maka semua modul perpustakaan standar akan secara otomatis dapat diakses dari lingkungan virtual.
Terlepas dari perubahan ini, sebagian besar pustaka pihak ketiga untuk bekerja dengan lingkungan virtual menggunakan pendekatan lama.
PS: Saya penulis artikel ini, kamu bisa bertanya.