上下文:从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,它被错误地关闭,作为重复项。
答案 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
不用说,您之后可能需要清理其中的内容。