如何从子进程中检索有用的结果?

时间:2014-07-02 10:43:28

标签: python string bash python-3.x subprocess

综述

哪种陈述可以:

b'10.0.3.15'

转换为:

'10.0.3.15'

What does a b prefix before a python string mean?解释了' b'但不回答这个问题。

关于这个问题的工作答案当然会被投票解决。

完整

从shell可以找到我的IP地址和复杂语句:

ip addr show eth0 | awk '$1 == "inet" {gsub(/\/.*$/, "", $2); print $2}'

(来源:Parse ifconfig to get only my IP address using Bash

对我而言:10.0.3.15

没关系。

现在我希望在Python中执行此语句或任何语句。因为该语句具有所有类型的特定标记,所以我只写入文件,并将文件读入变量cmd

我检查了cmd的内容与上述声明相同。现在我在Python中执行此命令:

p = subprocess.Popen(cmd, shell=True,
                     stdout=subprocess.PIPE,
                     stderr=subprocess.STDOUT)
b = p.communicate()  

结果是一个元组,我只需要内容:

value = b[0]

值为b'10.0.3.15\\n'

Format Specification Mini Language我看到' b'是一种代表二进制的类型。

我只需要'10.0.3.15'。如何实现?

1 个答案:

答案 0 :(得分:1)

使用out, _ = p.communicate()。然后,您的输出将保存为变量out中的字符串。要删除\n。您可以使用strip()(例如out.strip())。

import subprocess

device = 'em1'
cmd = "ip addr show %s | awk '$1 == \"inet\" {gsub(/\/.*$/, \"\", $2); print $2}'" % device

p = subprocess.Popen(cmd, shell=True,
                     stdout=subprocess.PIPE,
                     stderr=subprocess.STDOUT)
out, _ = p.communicate()
print(out.strip())

但你应该看一下Python模块netifaces

import netifaces
device = 'em1'
print(netifaces.ifaddresses(device)[netifaces.AF_INET])

这将输出如下内容:

[{'broadcast': '192.168.23.255', 'netmask': '255.255.255.0', 'addr': '192.168.23.110'}]