Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中解析pip列表/pip冻结的输出_Python_List_Tuples - Fatal编程技术网

在python中解析pip列表/pip冻结的输出

在python中解析pip列表/pip冻结的输出,python,list,tuples,Python,List,Tuples,你好,我有这样一个字符串: 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) 我想把它拆分成一个元组列表。 因此,每个列表项都有一个元组,其中包含两个值:名称和版本(不带括号) 我只能用换行符拆分字符串,但我不知道如

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

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)
我想把它拆分成一个元组列表。 因此,每个列表项都有一个元组,其中包含两个值:名称和版本(不带括号)

我只能用换行符拆分字符串,但我不知道如何正确地抓住括号中的数字等 有人能告诉我怎么做吗

编辑: 我正在尝试解析
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)
我有一个项目,我不能只是分割字符串,但它需要一个字节一样的对象

TypeError: a bytes-like object is required, not 'str'
直截了当地说:

data = '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)'
result = [tuple(line.replace('(', '').replace(')', '').split())
          for line in data.splitlines()]

print(result)
输出:

[('AdvancedHTMLParser', '8.0.1'), ('appdirs', '1.4.3'), ('beautifulsoup4', '4.6.0'), ('chardet', '3.0.4'), ('chrome-gnome-shell', '0.0.0'), ('cupshelpers', '1.0'), ('cycler', '0.10.0'), ('Cython', '0.27.3')]

拆分开始部分的每一行并删除结束部分:

self.__all_modules = [tuple(x[:-1].split(" (")) for x in data.splitlines()]
您还可以使用:


选项1
如果您从
pip
获取这些输出,则可以使用
pip.operations.freeze
-

from pip.operations import freeze  

modules = list(
    map(lambda x: x.split('=='), freeze.freeze(local_only=True))
)

print(modules)

[['aiodns', '1.1.1'],
 ['aiohttp', '1.2.0'],
 ['appdirs', '1.4.0'],
 ['appnope', '0.1.0'],
 ['argparse', '1.4.0'],
...

选项2
您也可以使用
get\u installed\u发行版
,取自:


选项3
第三种方法是使用
pip.main
-

import pip
pip.main(['list', 'local'])

但是,这会写入标准输出

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

所有这些方法现在都在私有包中。 例如,冻结模块处于关闭状态。您仍然可以使用它,但我个人认为使用内部软件包不是一个好主意。在新版本中,它们可能很容易移动或更改

您可以继续使用PIPCLI版本,使用
--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]

这是否来自
pip freeze
?如果您试图解析
pip freeze
的输出,您可以通过python以编程方式完成。@cᴏʟᴅsᴘᴇᴇᴅ , 是的,请看我编辑的帖子。很好,有一个比这个简单得多的方法。发现一个错误,让我修复它。。。固定的;谢谢你的回复,你现在可以收回你的否决票了(如果这是原因的话)。当我试图直接像这样查询数据并进行拆分时:
data=subprocess.check_output([“pip”,“list”,“--local”])result=[tuple(line.replace(“(”,”).replace(“),”.split())for line in data.splitlines()]print(结果)
我得到一个异常
类型错误:需要一个类似字节的对象,而不是'str'
。我能做些什么来解决这个问题?我的意思是数据应该是字符串..不,我使用的是python 3.6Perfect!谢谢!@user4042470不客气。当然,请尝试一下,让我知道哪一个不起作用。干杯。还有什么方法可以检查某个virtualenv?因为freeze.freeze是针对virtualenv之外的本地包的,我相信?@user4042470也许你需要将
isolated=True
传递给
freeze
?不幸的是,没有关于以编程方式使用pip的文档,所以我甚至不知道一半参数的作用。一定有办法,但我不是很确定。
import pip
pip.main(['list', 'local'])
 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]