Python中的awk:子进程参数错误?

2 投票
2 回答
14540 浏览
提问于 2025-04-17 19:06

我需要在Python中运行以下这个(有效的)命令

ip route list dev eth0 | awk ' /^default/ {print $3}'

如果用subprocess模块,我需要这样做:

first = "ip route list dev eth0"
second = "awk ' /^default/ {print $3}'"
p1 = subprocess.Popen(first.split(), stdout=subprocess.PIPE)
p2 = subprocess.Popen(second.split(), stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]

但是在p2这部分出了点问题。我得到了:

>>> awk: cmd. line:1: '
awk: cmd. line:1: ^ invalid char ''' in expression

我该怎么做呢?在终端里这个命令运行得很好。

2 个回答

4

这不是最好的解决办法,但在你等待更好的答案时,你可以先试试这个:

cmd = "ip route list dev eth0 | awk ' /^default/ {print $3}'"
p2 = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
16

split 函数会在任何空格处进行分割,包括单引号中的内容。如果你真的需要这样做,可以使用 shlex.split

import shlex
p2 = subprocess.Popen(shlex.split(second), stdin=p1.stdout, stdout=subprocess.PIPE)

不过,通常直接指定命令会更合理:

first = ['ip', 'route', 'list', 'dev', 'eth0']
second = ['awk', ' /^default/ {print $3}']
p1 = subprocess.Popen(first, stdout=subprocess.PIPE)
p2 = subprocess.Popen(second, stdin=p1.stdout, stdout=subprocess.PIPE)

撰写回答