This is a bash command that I run in python and get the expected result:
count = subprocess.Popen("ps -ef | grep app | wc -l", stdout=subprocess.PIPE, shell=True)
but when I'd like to pass an argument (count in this case) cannot figure out how to do it. I tried:
pid = subprocess.call("ps -ef | grep app | awk -v n=' + str(count), 'NR==n | awk \'{print 2ドル}\'", shell=True)
and
args = shlex.split('ps -ef | grep app | awk -v n=' + str(count), 'NR==n | awk \'{print 2ドル}\'')
pid = subprocess.Popen(args, stdout=subprocess.PIPE, shell=True)
among other attempts, from various posts here, but still cannot make it.
3 Answers 3
You're mixing opening and closing quotations and you pass a colon by mistake on your other attempts among other things.
Try this for a fix:
pid = subprocess.call("ps -ef | grep app | awk -v n=" + str(count) + " NR==n | awk '{print 2ドル}'", shell=True)
You opened the command parameter with " and there for you need to close it before you do + str() with a " and not a '. Further more i swapped the , 'NR= with + "NR= since you want to append more to your command and not pass a argument to subprocess.call().
As pointed out in the comments, there's no point in splitting the command with shlex since piping commands isn't implemented in subprocess, I would however like to point out that using shell=True is usually not recommended because for instance one of the examples given here.
3 Comments
n=str(count) and NR==nAn other vay is using format:
pid = subprocess.call("ps -ef | grep app | awk -v n={} NR==n | awk '{{print 2ドル}}'".format(str(count)), shell=True)
1 Comment
'..n={}..'.format(str(count)), use '..n={n}..'.format(n=count) instead.Your Awk pipeline could be simplified a great deal - if the goal is to print the last match, ps -ef | awk '/app/ { p=2ドル } END { print p }' does that. But many times, running Awk from Python is just silly, and performing the filtering in Python is convenient and easy, as well as obviously more efficient (you save not only the Awk process, but also the pesky shell=True).
for p in subprocess.check_output(['ps', '-ef']).split('\n'):
if 'app' in p:
pid = p.split()[1]
4 Comments
call() returns the exit status (an integer), not a string. To learn how to read subprocess' output line-by-line, see this answer. Though if we are reimplementing the shell command in Python then we could use psutil module.check_output() instead (which however won't work with Pythons older than 2.7).subprocess.call() too...?check_output(['ps', '-ef']).split('\n') won't work in Python 3. Yes, pid name as the result of call() is misleading.
' + str(..)rather than with" + str(...). And on the second attempt you pass a colon as such, 'NR==for whatever reason. Your syntax is all over the place.