有没有更好的方法使用python-cod从输出中提取数据

2024-09-29 01:34:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个新的python代码来查找安装在我将从中运行代码的系统上的软件列表。如果软件没有安装,我打算告诉用户。在

输出如下:(dpkg-l)

A snippet below:
----------------

ii  git                                    1:1.7.9.5-1                             fast, scalable, distributed revision control system
ii  git-man                                1:1.7.9.5-1                             fast, scalable, distributed revision control system (manual pages)


c = subprocess.Popen(['dpkg','-l'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
list_of_packages,error = c.communicate()
for item in list_of_packages.split('\n'):
    print item.split('ii')[-1]

我将不得不应用更多的拆分来获得所需的数据。 git和1.7.9.5(版本名)。在

我只是想知道有没有更好的方法来达到这个目的。在

请指点。。在

谢谢, -维杰


Tags: of代码git软件revisionsystemcontrollist
2条回答

正如您所观察到的,试图解析人类可读的输出是脆弱的。幸运的是,您可以将dpkg -l替换为dpkg-query -W -f='${Package}\t${Version}\n',这是为生成机器可读输出而设计的。有关dpkg-query选项的完整列表,请参见http://manpages.ubuntu.com/manpages/lucid/man1/dpkg-query.1.html。在

>>> args = ["dpkg-query", "-W", "-f=${Package}\t${Version}\n"]
>>> out, err = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
>>> print out #output is summarized, clearly
git     1:1.7.9.5-1
git-man 1:1.7.9.5-1

dpkg -l输出不包含ii的行。而且可能有一些包的名称中包含ii。在

我会这样做:

for item in list_of_packages.splitlines():
    if item.startswith('ii'):
        print item[4:]

相关问题 更多 >