Dalam Python 3.8, diusulkan untuk menambahkan alternatif ke lingkungan virtual - direktori lokal dengan PEP 582 paket direktori paket lokal Python .
PEP ini menyarankan untuk menambahkan mekanisme untuk secara otomatis mendeteksi direktori __pypackages__
dalam Python dan menggunakannya ketika mengimpor sebagai sumber paket yang diinstal. Direktori __pypackages__
akan memiliki prioritas lebih tinggi pada impor daripada direktori paket global atau kustom. Ini akan mencegah pembuatan, aktivasi atau penonaktifan lingkungan virtual.
Ini adalah struktur paket menggunakan __pypackages__
akan terlihat seperti di Python 3.8:
foo __pypackages__ 3.8 lib bottle myscript.py
Dalam artikel ini, saya akan menunjukkan kepada Anda bagaimana menggunakan direktori lokal dengan paket-paket tanpa menunggu Python 3.8 keluar.
Artikel ini menjelaskan contoh dasar yang diuji di Linux, Python 3.5. Untuk platform lain, Anda mungkin perlu melakukan perubahan.
Menginstal paket di direktori lokal
Instalasi hampir sama dengan menginstal paket menggunakan pip, dengan pengecualian opsi --target
. Di dalamnya kami menunjukkan path lengkap atau relatif ke direktori dengan paket lokal.
pip3 install --target="$PWD/__pypackages__/3.5/lib/" bar
$ PWD adalah variabel dengan direktori kerja saat ini.
Pohon direktori berikut akan dibuat:
foo __pypackages__ 3.5 lib bar myscript.py
Versi dan subdirektori Python harus ditentukan secara manual.
Mungkin juga ada masalah jika Anda perlu menginstal paket dengan kode biner dan untuk arsitektur yang berbeda. Saya tidak punya paket seperti itu, tetapi sebagai solusi, Anda dapat menambahkan lebih banyak arsitektur ke struktur direktori.
Opsi instalasi lainAda cara lain untuk menginstal paket di direktori tertentu:
pip3 install --ignore-installed --install-option="--prefix=$PWD/__pypackages__" --install-option="--no-compile" bar
Tetapi Anda harus menentukan path lengkap ke lokasi instalasi dan pohon direktori akan berbeda dari yang diusulkan dalam PEP 582:
foo __pypackages__ lib python3.5 site-packages bar myscript.py
Menggunakan direktori lokal dengan paket
Setelah menginstal paket, tetap memberi tahu juru bahasa tempat mencari dependensi.
Untuk melakukan ini, tambahkan path ke direktori lokal dengan paket ke daftar sys.path
. Cukup menambahkan path ke modul utama (pertama kali dimuat), menambahkan sisanya tidak perlu. Setelah itu, Anda dapat mengimpor paket yang diinstal secara lokal.
import os import sys _PATH = '/__pypackages__/3.5/lib/' sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)) + _PATH) import bar
Satu-satunya syarat adalah modul utama harus berada pada level yang sama dengan direktori __pypackages__
.
Cara lain untuk memberi tahu Python di mana mencari paket adalah dengan menetapkan variabel lingkungan sebelum menjalankan skrip.
PYTHONPATH="$PWD/__pypackages__/3.5/lib/:$PYTHONPATH" python3 ./myscript.py
Sedemikian sederhana, Anda dapat mencapai fungsionalitas yang mirip dengan PEP 582 sekarang.