Перевстановіть пакунки автоматично у віртуальне середовище після оновлення основної версії Python


10

У мене на моєму диску лежать кілька віртуальних середовищ (десятки), зроблені venvмодулем Python 3.6. Тепер я швидко перейшов до Ubuntu 19.10, і лише після цього помітив, що 3.6 не доступний для Ubuntu 19.10 із загальновизнаних джерел. Мені вдалося оновити версії Python цих віртуальних середовищ, розмістивши bin/python3під домашнім каталогом і запустивши python3.7 -mvenv --upgradeпапки, що містять їх.

Тепер, python3.7 -mvenv --upgradeоновлюючи Python у віртуальному середовищі, він нічого не робить для того, щоб перевстановити мої попередні версії пакета в lib/python3.7/site-packagesрамках цього venv. Я думаю, що я міг би це зробити, встановивши Python 3.6, pip freezeвстановивши вимоги з, venvа потім модернізувавши venv до Python 3.7, pip install -rін. - якби тільки для моєї нової ОС була доступна установка Python 3.6.

Чи є якийсь інший спосіб зробити це досить автоматизованим способом (можливо, головним чином, pip freezeвикористовуючи старий lib/python3.6каталог), не маючи необхідності встановлювати Python 3.6 з джерела, використовуючи conda або встановлюючи 3.6 з якихось випадкових PPA? Я хочу оновити всі середовища, щоб у майбутньому, коли мені потрібно щось робити із випадковим середовищем, він продовжував би працювати з Python 3.7.

Відповіді:


11

У вашому новому 3,7 venv ви повинні мати pkg_resourcesдоступний - setuptoolsвін автоматично встановлюється при створенні. Якщо ні, просто pip install setuptools.

setuptoolsбібліотечний код - це насправді те, що pipпостачає, щоб зробити pip freezeроботу. Але ви можете просто заморозити його вручну.

# 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())

Ви можете кинути цей вихід у requirements.txtфайл і, ймовірно, мати реконструйований робочий сайт, ніpython3.6 вимагаючи часу виконання.

Зауважте, що цей метод не може бути 100% надійним, оскільки проекти можуть оголошувати окремі дерева залежностей для python3.6 та python3.7, використовуючи маркери навколишнього середовища у своїх метаданих розподілу (див. PEP 508 ). Також можливо , що елементи , встановлені в 3.6 сайту не підтримують 3.7 на всіх . Однак доволі рідко можна побачити, що в другорядній версії піднімаються між 3,6 і 3,7, тому просто використання робочого набору повинно бути "досить хорошим" на практиці.


"Досить хороший" є досить хорошим у цьому випадку. Немає проблем з оновленням непарного модуля тут і там після того, як була проведена велика робота.
Антті Хаапала
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.