在Python中使用bash命令的输出结果

4 投票
2 回答
3372 浏览
提问于 2025-04-16 16:10

我正在尝试用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 个回答

2

我建议你用 subprocess 模块来代替 os.system:http://docs.python.org/library/subprocess.html#module-subprocess

这个模块可以让你和命令行进行交流(输入和输出)。文档里有详细的使用说明。

希望这对你有帮助!

8

首先,不建议使用 input(),因为它要求用户输入有效的 Python 表达式。建议使用 raw_input() 来替代:

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

接下来,system('pidof') 的返回值不是进程 ID(PID),而是 pidof 命令的退出代码,也就是说,成功时返回零,失败时返回非零。你需要 获取 pidof 的输出

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")

撰写回答