我正在尝试编写一个python脚本,在许多方面,调用可执行文件并存储可执行文件在变量中发送到stdout的内容。这就是我所拥有的:
1 #!/usr/bin/python
2 import subprocess
3
4 subprocess.call("./pmm", shell=True)
如何将pmm的输出存储在变量中?
答案 0 :(得分:6)
在Python 2.7(及3.1或更高版本)中,您可以使用subprocess.check_output()
。文档中的示例:
>>> subprocess.check_output(["ls", "-l", "/dev/null"])
'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
答案 1 :(得分:5)
p = subprocess.Popen(["./pmm"], shell=False, stdout=subprocess.PIPE)
output = p.stdout.read()
答案 2 :(得分:1)
我前段时间写了一篇关于此事的帖子:
http://trifoliummedium.blogspot.com/2010/12/running-command-line-with-python-and.html
使用p.communicate()获取stdout和stderr
答案 3 :(得分:0)
首先,您必须保存对子流程的引用(将其绑定到名称...,在其他语言中,更通过非正式地称为“将其分配给变量”)。所以你应该使用像proc = subprocess.Popen(...)
从那里我建议您调用proc.poll()
来测试程序是否已完成,并且睡眠(例如使用time.sleep()
功能)或执行其他工作(使用select.select()
例如)然后再次检查。或者你可以调用proc.wait()
,这样你就可以确保这个./pmm命令在程序继续之前完成了它的工作。如果子进程仍在运行,则子进程实例上的poll()
方法将返回“None”;否则它将返回在该子进程上运行的命令的退出值。子进程的wait()
方法将导致程序阻塞,然后返回退出值。
之后,您可以调用(output, errormsgs) = proc.communicate()
来捕获子进程的任何输出或错误消息。如果输出太大,可能会导致问题;使用流程实例的.stdout
(PIPE文件描述符)是棘手的,如果你打算尝试这个,那么你应该使用fcntl
(文件描述符控件)模块中的功能将其切换为非阻塞模式并准备好处理在缓冲区空闲时尝试read()
调用时引发的异常。