How to store the result of an executed shell command in a variable in python?
Solution 1
Use the subprocess
module instead:
import subprocess
output = subprocess.check_output("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'", shell=True)
Edit: this is new in Python 2.7. In earlier versions this should work (with the command rewritten as shown below):
import subprocess
output = subprocess.Popen(['awk', '/f89e7000/ {print $2}', 'syscall_list.txt'], stdout=subprocess.PIPE).communicate()[0]
As a side note, you can rewrite
cat syscall_list.txt | grep f89e7000
To
grep f89e7000 syscall_list.txt
And you can even replace the entire statement with a single awk
script:
awk '/f89e7000/ {print $2}' syscall_list.txt
Leading to:
import subprocess
output = subprocess.check_output(['awk', '/f89e7000/ {print $2}', 'syscall_list.txt'])
Solution 2
os.popen works for this. popen - opens a pipe to or from command. The return value is an open file object connected to the pipe, which can be read. split('\n') converts the output to list
import os
list_of_ls = os.popen("ls").read().split('\n')
print list_of_ls
import os
list_of_call = os.popen("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'").read().split('\n')
print list_of_call
Solution 3
commands.getstatusoutput would work well for this situation. (Deprecated since Python 2.6)
import commands
print(commands.getstatusoutput("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'"))
Solution 4
In python 3 you can use
import subprocess as sp
output = sp.getoutput('whoami --version')
print (output)
``
user567879
Updated on July 17, 2022Comments
-
user567879 almost 2 years
I need to store the result of a shell command that I executed in a variable, but I couldn't get it working. I tried like:
import os call = os.system("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'") print call
But it prints the result in terminal and prints the value of call as zero, possibly indicating as success. How to get the result stored in a variable?
-
georg over 12 yearssee here: stackoverflow.com/questions/1410976/…
-
-
user567879 over 12 yearsI am using python 2.6.6 and it gives me error:
AttributeError: 'module' object has no attribute 'check_output'
-
Rob Wouters over 12 years@user567879, You are right. This function was added in Python 2.7. I'll edit in a method for Python 2.6.
-
user567879 over 12 yearsWhat if i need to pass a python variable as an argument to the executed shell command?
-
Rob Wouters over 12 years@user567879: Just do it how you would normally put a variable in a list, i.e.
['awk', '/f89e7000/ {print $2}', filename]
, and pass that to Popen(). -
user3885927 about 6 yearsThe link doesn't work any more and this is removed in 3.x See docs.python.org/2/library/commands.html