2

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

私は何をすべきか?端末では完全に機能します。

4

2 に答える 2

13

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)
于 2013-03-14T16:06:13.873 に答える
3

最善の解決策ではありませんが、最善の答えを待っている間も、これを行うことができます:

cmd = "ip route list dev eth0 | awk ' /^default/ {print $3}'"
p2 = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
于 2013-03-14T16:08:03.130 に答える