Список пакетов (с соответствующими версиями), установленных в virtualenv без использования pip

Контекст: После обновления с Debian 8 до 9 Python 3.4 virtualenvs перестал работать, потому что системные пакеты сайта были заменены версией Python 3.5. Этот ответ предлагает удалить старый virtualenv, создать новый и переустановить все пакеты с помощью pip install -r requirements.txt. тем не мение, у меня нет requirements.txt для всех virtualenv. Я знаю, что такой файл можно создать с помощью pip freeze, но по указанной выше причине pip не будет работать 1.

Проблема: Мне нужно создать список пакетов и их соответствующих установленных в virtualenv, которые я не могу активировать.

Вопрос: Есть ли способ получить список, аналогичный выводу pip freeze для virtualenv, без фактического запуска pip?

Примечание: Этот вопрос отличается от «Вернуть список импортированных модулей Python, используемых в скрипте?» тем, что запрашиваемые ответы не должны требовать доступа к сценариям, использующим virtualenv, а также должны возвращать версии пакетов, установленных в virtualenv2.


1 Namely, running pip (with any parameters) raises ImportError: No module named 'encodings'.

2 Full disclosure: I asked a similar question that was wrongly closed as duplicate.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
0
1 619
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Получить список установленных пакетов без работающего пипа будет очень сложно. В качестве альтернативы вы можете попытаться разобраться в именах файлов, установленных в вашем каталоге virtualenv site-packages:

Вы можете получить каталог site-packages, запустив

python -m site

и ищу строку вроде

'/your/venv/lib/python3.4/site-packages'

Выбери этот путь и беги

ls -d /your/venv/lib/python3.4/site-packages/*.dist-info

Это должно дать вам список большинства установленных каталогов пакетов в вашем virtualenv.

Чтобы очистить этот список и создать файл requirements.txt, который несколько напоминает правильный синтаксис и данные, вы можете использовать

ls -d /your/venv/lib/python3.4/site-packages/*.dist-info | xargs -I% basename % | sed 's/\.dist-info//; s/-/==/; s/_/-/' > requirements.txt

Излишне говорить, что вам, вероятно, впоследствии потребуется немного очистить его содержимое.

Отлично, спасибо! Действительно, вывод все еще нуждается в очистке. Например, пакет с именем some-package будет храниться в каталоге some_package-version.dist-info (обратите внимание, что тире стало подчеркиванием). Но это можно сделать вручную.

Arcturus B 06.08.2018 16:20

Не знал про модуль site, очень полезно. Я заставлял людей открывать свои REPL и печатать sys.path для меня, чтобы помочь отладить проблемы со средой ... теперь я знаю лучший способ благодаря этому ответу!

Matt Messersmith 06.08.2018 16:22

Я добавил еще одну команду sed, которая заменяет _ на - в конвейер. Однако, вероятно, есть пакеты, которые действительно содержат символ подчеркивания.

Nils Werner 06.08.2018 16:23

Кажется, что pip заменяет _ на -: stackoverflow.com/a/19131777/4352108, так что все это в любом случае не должно быть проблемой. :)

Arcturus B 06.08.2018 16:30

Другие вопросы по теме