awk from Python: wrong subprocess arguments?
11,620
Solution 1
split
splits on any whitespace, including that inside single-quoted arguments. If you really have to, use shlex.split
:
import shlex
p2 = subprocess.Popen(shlex.split(second), stdin=p1.stdout, stdout=subprocess.PIPE)
However it usually makes more sense to specify the commands directly:
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)
Solution 2
Not the best solution, but while you are waiting for the best answer, you can still do this :
cmd = "ip route list dev eth0 | awk ' /^default/ {print $3}'"
p2 = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
Author by
Ricky Robinson
Updated on June 05, 2022Comments
-
Ricky Robinson almost 2 years
I need to run the following (working) command in Python:
ip route list dev eth0 | awk ' /^default/ {print $3}'
Using
subprocess
, I would have to do the following: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]
Something went wrong with
p2
. I get:>>> awk: cmd. line:1: ' awk: cmd. line:1: ^ invalid char ''' in expression
What should I do? On a terminal it works perfectly.