如何在python中的变量中存储执行的shell命令的结果?

时间:2011-12-28 17:39:19

标签: python linux bash shell

我需要存储我在变量中执行的shell命令的结果。但我无法做到这一点。我尝试过:

call=os.system("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'")
print call

但它在终端中输出结果并将call的值打印为零,可能表示成功。如何将结果存储在变量中?

5 个答案:

答案 0 :(得分:36)

改为使用subprocess模块:

import subprocess
output = subprocess.check_output("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'", shell=True)

编辑:这是Python 2.7中的新功能。在早期版本中,这应该有效(使用如下所示的命令重写):

import subprocess
output = subprocess.Popen(['awk', '/f89e7000/ {print $2}', 'syscall_list.txt'], stdout=subprocess.PIPE).communicate()[0]

作为旁注,您可以重写

cat syscall_list.txt | grep f89e7000

grep f89e7000 syscall_list.txt

您甚至可以用一个awk脚本替换整个语句:

awk '/f89e7000/ {print $2}' syscall_list.txt

导致:

import subprocess
output = subprocess.check_output(['awk', '/f89e7000/ {print $2}', 'syscall_list.txt'])

答案 1 :(得分:10)

commands.getstatusoutput适用于这种情况。

import commands
print(commands.getstatusoutput("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'"))

答案 2 :(得分:0)

在python 3中,您可以使用

import subprocess as sp
output = sp.getoutput('whoami --version')
print (output)

``

答案 3 :(得分:0)

os.popen适用于此目的。 popen-打开与命令之间的管道。返回值是连接到管道的打开文件对象,可以读取该对象。 split('\ n')将输出转换为列表

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

答案 4 :(得分:-1)

这里的所有其他答案都是很好的答案。在许多情况下,您需要运行外部命令。

此特定示例还有另一个选项:您可以读取文件,逐行处理,并对输出执行某些操作。

虽然这个答案对“被问到的更普遍的问题”不起作用,但我认为应该始终予以考虑。即使在可能的情况下,它也并非总是“正确答案”。记住这个(更容易),知道何时(不)应用它(更难),将使你成为更好的程序员。