列出安装在virtualenv中的软件包(具有相应版本),而无需使用pip

时间:2018-08-06 14:14:25

标签: python pip virtualenv

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

问题::我需要生成无法激活的虚拟环境中安装的软件包及其各自的列表。

问题:是否可以在不实际运行pip的情况下为virtualenv获取类似于pip freeze输出的列表?

注意:该问题与“ Return a list of imported Python modules used in a script?”不同,因为请求的答案不需要访问使用virtualenv的脚本,并且还应返回软件包的版本安装在virtualenv 2 中。


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

2 全面披露:我问一个similar question,它被错误地关闭,作为重复项。

1 个答案:

答案 0 :(得分:4)

在没有有效点的情况下获取已安装软件包的列表将非常困难。另外,您可以尝试从安装在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

不用说,您之后可能需要清理其中的内容。