如何从子进程中获取有效结果?
总结
用哪个语句可以:
b'10.0.3.15'
转换成:
'10.0.3.15'
Python字符串前面的b前缀是什么意思? 解释了'b'的含义,但没有回答这个问题。
如果有人能给出一个有效的答案,当然会被投票认为已解决。
详细内容
在命令行中,我可以用一个复杂的语句找到我的IP地址:
ip addr show eth0 | awk '$1 == "inet" {gsub(/\/.*$/, "", $2); print $2}'
这个语句返回给我的结果是: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'}]