2 回答
TA贡献1946条经验 获得超4个赞
您的 shell 命令正在调用两个命令, 的输出ifconfig用作sed. 您可以使用 subprocess 来模拟它,但sed调用只是进行一些文本操作,因此更简洁的方法是在该步骤中使用 Python。例如:
import re
import subprocess
pattern = r'inet (?:addr:)?(?!127\.0\.0\.1)((?:\d+\.){3}\d+)'
p = subprocess.Popen(['ifconfig'], stdout=subprocess.PIPE)
text = re.search(pattern, p.stdout.read()).group(1)
retcode = p.wait()
TA贡献1829条经验 获得超7个赞
ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'
您正在尝试调用 2 个 shell 命令,ifconfig并且sed,没关系。但是,这些是 shell 命令,在调用subprocess.Poen.
使用communictae方法,最好用在这里。并将命令作为字符串而不是列表发送。
import subprocess
command = ' '.join(['ifconfig', '|', 'sed', '-En', 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'])
p = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
stdoutdata, stderrdata = p.communicate() #this is blocking
for line in stdoutdata:
#do some thing with line
Popen.communicate(input=None)
与进程交互:将数据发送到标准输入。从 stdout 和 stderr 读取数据,直到到达文件末尾。等待进程终止。可选的输入参数应该是一个要发送给子进程的字符串,如果没有数据应该发送给子进程,则为 None。
添加回答
举报