获取bash命令的结果并在python中使用它

时间:2011-04-21 13:48:16

标签: python bash operating-system command

我正在尝试在python中编写一个代码,它将从顶部获取一些信息并将其放入文件中。 我想只写下应用程序的名称并生成文件。我遇到的问题是我无法获得pidof命令的输出,所以我可以在python中使用它。我的代码如下所示:

import os

a = input('Name of the application')
val=os.system('pidof ' + str(a)) 
os.system('top -d 30 | grep' + str(val) + '> test.txt')
os.system('awk '{print $10, $11}' test.txt > test2.txt')

问题是val总是有0但是命令返回我想要的pid。任何输入都会很棒。

2 个答案:

答案 0 :(得分:8)

首先,不鼓励使用input(),因为它希望用户输入有效的Python表达式。请改用raw_input()

app = raw_input('Name of the application: ')

接下来,system('pidof')的返回值不是PID,它是pidof命令的退出代码,即成功时为零,失败时为非零。您想要pidof的{​​{3}}。

import subprocess

# Python 2.7 only
pid = int(subprocess.check_output(['pidof', app]))

# Python 2.4+
pid = int(subprocess.Popen(['pidof', app], stdout=subprocess.PIPE).communicate()[0])

# Older (deprecated)
pid = int(os.popen('pidof ' + app).read())

下一行在grep之后缺少空格,并且会产生grep1234之类的命令。使用字符串格式化操作符%将使这更容易发现:

os.system('top -d 30 | grep %d > test.txt' % (pid))

第三行引用严重,应该导致语法错误。注意单引号内的单引号。

os.system("awk '{print $10, $11}' test.txt > test2.txt")

答案 1 :(得分:2)

我建议您使用子进程模块http://docs.python.org/library/subprocess.html#module-subprocess

,而不是os.system

使用该模块,您可以与shell进行通信(输入和输出)。文档说明了如何使用它的详细信息。

希望这有帮助!