Instal ulang paket secara otomatis ke lingkungan virtual setelah peningkatan versi utama Python

10

Saya punya beberapa lingkungan virtual (puluhan) yang tergeletak di disk saya yang dibuat oleh venvmodul Python 3.6. Sekarang saya telah memutakhirkan ke Ubuntu 19.10 dengan tergesa-gesa dan hanya setelah itu memperhatikan bahwa 3.6 tidak tersedia sama sekali untuk Ubuntu 19.10 dari sumber yang diakui secara umum. Saya telah berhasil memutakhirkan versi Python dari lingkungan virtual ini dengan mencari di bin/python3bawah direktori home saya dan berjalan python3.7 -mvenv --upgradepada folder yang berisi.

Sekarang, ketika python3.7 -mvenv --upgradememutakhirkan Python di lingkungan virtual, ia tidak melakukan apa pun untuk menginstal ulang versi paket saya sebelumnya di lib/python3.7/site-packagesbawah itu venv. Saya kira saya bisa melakukan ini dengan menginstal Python 3.6, pip freezedengan persyaratan dari venvdan kemudian memutakhirkan venv ke Python 3.7, pip install -ring - jika saja ada Python 3.6 instal tersedia untuk OS baru saya.

Apakah ada cara lain untuk melakukan ini dengan cara yang agak otomatis (mungkin terutama pip freezemenggunakan lib/python3.6direktori yang lama ) tanpa saya harus menginstal Python 3.6 dari sumber, menggunakan conda atau menginstal 3.6 dari beberapa PPA acak? Saya ingin memutakhirkan semua lingkungan secara massal sehingga di masa mendatang ketika saya perlu melakukan sesuatu dengan lingkungan acak, ia akan terus bekerja dengan Python 3.7.

Antti Haapala
sumber

Jawaban:

11

Di 3.7 venv baru Anda, Anda seharusnya memiliki pkg_resources- setuptoolsdiinstal secara otomatis saat dibuat. Jika tidak, adil saja pip install setuptools.

setuptoolskode perpustakaan sebenarnya adalah apa pipyang membatalkan untuk membuat pip freezepekerjaan. Tapi Anda bisa membekukannya secara manual.

# in 3.7 runtime...
import pkg_resources
old_site_dir = ".venv/lib/python3.6/site-packages/"
working_set = pkg_resources.WorkingSet([old_site_dir])
for dist in working_set:
    print(dist.as_requirement())

Anda dapat membuang output itu dalam requirements.txtfile dan kemungkinan memiliki situs yang direkonstruksi, tidak python3.6perlu runtime.

Perhatikan bahwa metode ini mungkin bukan 100% sangat mudah, karena dimungkinkan bagi proyek untuk mendeklarasikan pohon dependensi terpisah untuk python3.6 dan python3.7 dengan menggunakan penanda lingkungan dalam metadata distribusinya (lihat PEP 508 ). Mungkin juga item yang diinstal di situs 3.6 Anda tidak mendukung 3.7 sama sekali . Namun sangat jarang untuk melihat bahwa dalam versi kecil bertemu antara 3,6 dan 3,7, jadi hanya menggunakan set kerja harus "cukup baik" dalam praktek.

wim
sumber
"Cukup baik" adalah cukup baik dalam hal ini. Tidak ada masalah dalam memperbarui modul aneh di sana-sini setelah pekerjaan massal selesai.
Antti Haapala