上下文: 从 Debian 8 更新到 9 后,Python 3.4 virtualenvs 停止工作,因为系统站 pip 包全部被 Python 3.5 版本替换。 This answer建议删除旧的 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 的脚本,并且还应该返回安装在 virtualenv2 中的包的版本。
1 也就是说,运行 pip
(带有任何参数)会引发 ImportError: No module named 'encodings'
。
2 全面披露:我问了一个 similar question被错误地关闭为重复。
最佳答案
在没有有效 pip 的情况下获取已安装包的列表将非常困难。或者,您可以尝试从安装在 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 中大多数已安装包目录的列表。
要清理此列表并创建一个有 pip 类似于正确语法和数据的 requirements.txt
文件,您可以使用
ls -d /your/venv/lib/python3.4/site-packages/*.dist-info | xargs -I% basename % | sed 's/\.dist-info//; s/-/==/; s/_/-/' > requirements.txt
不用说,之后您可能需要稍微清理一下它的内容。
关于python - 在不使用 pip 的情况下列出安装在 virtualenv 中的包(具有相应版本),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51709681/