Переустановите пакеты автоматически в виртуальную среду после Python обновления основной версии - PullRequest
10 голосов
/ 22 января 2020

На моем диске лежат несколько виртуальных сред (десятки), созданных модулем 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 ing - , если только была Python 3.6 установка доступна для моей новой ОС.

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

1 Ответ

11 голосов
/ 22 января 2020

В вашем новом 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, используя маркеры среды в своих метаданных распространения (см. ОПТОСОЗ 508 ). Также возможно, что элементы, установленные на вашем сайте 3.6, вообще не поддерживают 3.7 . Тем не менее, довольно редко можно увидеть, что в младшей версии наблюдается увеличение между 3,6 и 3,7, поэтому на практике достаточно просто использовать рабочий набор.

...