Переустановите пакеты автоматически в виртуальную среду после обновления основной версии 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, поэтому на практике достаточно просто использовать рабочий набор.

Wim
источник
«Достаточно хорошо» это достаточно хорошо в этом случае. Нет проблем в обновлении нечетного модуля здесь и там после того, как основная работа была сделана.
Антти Хаапала