如何从子进程中获取有效结果?

0 投票
1 回答
1534 浏览
提问于 2025-04-18 11:51

总结

用哪个语句可以:

b'10.0.3.15'

转换成:

'10.0.3.15'

Python字符串前面的b前缀是什么意思? 解释了'b'的含义,但没有回答这个问题。

如果有人能给出一个有效的答案,当然会被投票认为已解决。

详细内容

在命令行中,我可以用一个复杂的语句找到我的IP地址:

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

(来源:用Bash解析ifconfig只获取我的IP地址)

这个语句返回给我的结果是: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'

格式规范小语言中,我看到'b'表示二进制类型。

我只想要'10.0.3.15'。我该怎么做呢?

1 个回答

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'}]

撰写回答