在 python 中解析 pip list / pip freeze 的输出

n00*_*exe 2 python tuples list

你好,我有一个像这样的字符串:

AdvancedHTMLParser (8.0.1)\nappdirs (1.4.3)\nbeautifulsoup4 (4.6.0)\nchardet (3.0.4)\nchrome-gnome-shell (0.0.0)\ncupshelpers (1.0)\ncycler (0.10.0)\nCython (0.27.3)
Run Code Online (Sandbox Code Playgroud)

我想将其拆分为元组列表。这样每个列表项都有一个包含两个值的元组,即名称和版本(不带括号)。

我只能按换行符分割字符串,但我不知道如何正确获取括号中的数字等有人可以解释我如何做到这一点吗?

编辑: 我正在尝试解析pip list local

 def get_installed_modules(self):
    data = subprocess.check_output(["pip", "list", "--local"])
    result = [tuple(line.replace('(', '').replace(')', '').split())
              for line in data.splitlines()]
    print(result)
Run Code Online (Sandbox Code Playgroud)

我有一个项目,我不能只分割字符串,但它需要一个类似字节的对象......

TypeError: a bytes-like object is required, not 'str'
Run Code Online (Sandbox Code Playgroud)

Fab*_*ian 7

接受的答案不再适用于最新版本的 pip (> 10.0)

所有这些方法现在都在私有包中。例如,冻结模块位于_internal/operations中。您仍然可以使用它,但我个人认为使用内部包不是一个好主意。它们可以在新版本中轻松移动或更改。

你可以做的是继续使用 pip cli 版本,使用选项--format json来格式化输出并在 python 中解析它。

 import subprocess
 import json
 data = subprocess.check_output(["pip", "list", "--format", "json"])
 parsed_results = json.loads(data)
 [(element["name"], element["version"]) for element in parsed_results]
Run Code Online (Sandbox Code Playgroud)