在不使用 pip 的情况下列出安装在 virtualenv 中的包(具有相应版本)

List packages (with respective versions) installed in a virtualenv without using pip

上下文: 从 Debian 8 更新到 9 后,Python 3.4 virtualenvs 停止工作,因为系统站点包全部被 Python 3.5 替换版本。 建议删除旧的 virtualenv,创建一个新的,然后使用 pip install -r requirements.txt 重新安装所有软件包。 但是,我没有一个适用于所有 virtualenv 的 requirements.txt。我知道可以使用 pip freeze 创建这样的文件,但是由于上述原因,pip 将不起作用1.

问题: 我需要生成一个软件包列表以及它们各自安装在我无法激活的 virtualenv 中。

问题:有没有办法在没有实际 运行 pip 的情况下为 virtualenv 获取类似于 pip freeze 输出的列表?

注意:这个问题不同于“Return a list of imported Python modules used in a script?”,因为请求的答案不需要访问使用virtualenv的脚本,而且还应该return virtualenv2.

安装包的版本

1 即,运行 pip(带任何参数)引发 ImportError: No module named 'encodings'.

2 完全披露:我问了一个 similar question 被错误地关闭为重复。

在没有工作 pip 的情况下获取已安装软件包的列表将非常困难。或者,您可以尝试从安装在 virtualenv site-packages 目录中的文件名中理解:

您可以通过运行ning

获取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

不用说,之后您可能需要稍微清理一下它的内容。