在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]