在不使用pip的情况下,列出安装在虚拟环境中的软件包(及其版本)。

12 浏览
0 Comments

在不使用pip的情况下,列出安装在虚拟环境中的软件包(及其版本)。

背景:在从Debian 8更新到9之后,Python 3.4虚拟环境停止工作,因为系统的site-packages都被Python 3.5版本替换了。这个回答建议删除旧的虚拟环境,创建一个新的,并使用pip install -r requirements.txt重新安装所有包。然而,我没有一个适用于所有虚拟环境的requirements.txt文件。我知道可以使用pip freeze命令创建这样的文件,但是由于上述原因,pip无法工作1。

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

问题:有没有一种方法可以获取类似于pip freeze命令输出的虚拟环境的列表,而不实际运行pip命令?

注意:这个问题不同于“返回脚本中使用的导入的Python模块的列表?”,因为所需的答案不应该需要访问使用虚拟环境的脚本,并且还应该返回虚拟环境中已安装软件包的版本2。


1 具体来说,运行pip(带任何参数)会引发ImportError: No module named 'encodings'

2 全部披露:我曾经提过一个类似的问题,被错误地关闭为重复问题。

0
0 Comments

问题的出现原因:没有可用的pip,无法通过pip命令获取已安装的包列表。

解决方法:通过查看虚拟环境中的site-packages目录下的文件来获取已安装的包列表。

具体步骤如下:

1. 运行命令`python -m site`,找到其中类似于`'/your/venv/lib/python3.4/site-packages'`的路径,这是site-packages目录所在的路径。

2. 运行命令`ls -d /your/venv/lib/python3.4/site-packages/*.dist-info`,这将列出虚拟环境中安装的大部分包的目录。

3. 为了清理这个列表并创建一个类似于正确语法和数据的requirements.txt文件,可以使用命令`ls -d /your/venv/lib/python3.4/site-packages/*.dist-info | xargs -I% basename % | sed 's/\.dist-info//; s/-/==/; s/_/-/' > requirements.txt`。

需要注意的是,可能需要稍后清理requirements.txt文件的内容。

这个解决方法非常有用,可以在没有pip命令可用的情况下获取已安装的包列表。同时,还可以通过手动替换下划线和破折号来解决一些命名问题。

这种方法非常实用,可以避免需要让他人打开REPL并打印sys.path来帮助调试环境问题。同时,还可以使用sed命令将下划线替换为破折号。

总之,通过查看site-packages目录下的文件,可以获取到虚拟环境中已安装的包列表,然后通过一些命令和处理,可以生成类似于requirements.txt文件的内容。这是在没有可用pip命令的情况下获取已安装包列表的解决方法。

0