Контекст: После обновления с 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.
Получить список установленных пакетов без работающего пипа будет очень сложно. В качестве альтернативы вы можете попытаться разобраться в именах файлов, установленных в вашем каталоге 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
Излишне говорить, что вам, вероятно, впоследствии потребуется немного очистить его содержимое.
Не знал про модуль site
, очень полезно. Я заставлял людей открывать свои REPL и печатать sys.path
для меня, чтобы помочь отладить проблемы со средой ... теперь я знаю лучший способ благодаря этому ответу!
Я добавил еще одну команду sed
, которая заменяет _
на -
в конвейер. Однако, вероятно, есть пакеты, которые действительно содержат символ подчеркивания.
Кажется, что pip
заменяет _
на -
: stackoverflow.com/a/19131777/4352108, так что все это в любом случае не должно быть проблемой. :)
Отлично, спасибо! Действительно, вывод все еще нуждается в очистке. Например, пакет с именем
some-package
будет храниться в каталогеsome_package-version.dist-info
(обратите внимание, что тире стало подчеркиванием). Но это можно сделать вручную.