Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

awk from Python: wrong subprocess arguments?

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.

like image 768
Ricky Robinson Avatar asked Nov 30 '25 11:11

Ricky Robinson


2 Answers

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)
like image 196
ecatmur Avatar answered Dec 03 '25 00:12

ecatmur


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)
like image 38
Cyrille Avatar answered Dec 03 '25 00:12

Cyrille



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!