我已经阅读了很多关于这个主题的问题,甚至有两个已经接受了答案的问题,然后在评论中出现了与我所遇到的相同的问题。
所以我想要做的是捕获这个命令的输出(在命令行中工作)
sudo /usr/bin/atq
在我的Python程序中。
这是我的代码(这是另一个问题中接受的答案)
from subprocess import Popen, PIPE
output = Popen(['sudo /usr/bin/atq', ''], stdout=PIPE)
print output.stdout.read()
这就是结果:
File "try2.py", line 3, in <module>
output = Popen(['sudo /usr/bin/atq', ''], stdout=PIPE)
File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1259, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
为什么这就是结果(在Python 2.7中,在debian Raspbarry Wheezy安装上)?
答案 0 :(得分:6)
我相信你需要做的就是改变,
output = Popen(['sudo /usr/bin/atq'], stdout=PIPE)
到
output = Popen(['sudo', '/usr/bin/atq'], stdout=PIPE)
当我在args
列表中包含多个参数作为单个字符串时,我收到同样的错误。
答案 1 :(得分:3)
Popen
的参数必须是一个列表,您可以使用shlex
自动为您处理
import shlex
args = shlex.split('sudo /usr/bin/atq')
print args
生成
['sudo', '/usr/bin/atq']
然后您可以传递给Popen
。然后,您需要使用您创建的流程communicate
。
跟.communicate()
一起去(注意Popen
的参数这里有一个列表!)即
prc = Popen(['sudo', '/usr/bin/atq'], stdout=PIPE, stderr=PIPE)
output, stderr = prc.communicate()
print output
Popen
会返回subprocess
句柄,您需要communicate
来获取输出。注意 - 添加stderr=PIPE
将允许您访问STDERR
以及STDOUT
。
答案 2 :(得分:1)
您可以使用subprocess.check_output()
:
subprocess.check_output(['sudo', '/usr/bin/atq'])
示例:
In [11]: print subprocess.check_output(["ps"])
PID TTY TIME CMD
4547 pts/0 00:00:00 bash
4599 pts/0 00:00:00 python
4607 pts/0 00:00:00 python
4697 pts/0 00:00:00 ps
帮助()强>:
In [12]: subprocess.check_output?
Type: function
String Form:<function check_output at 0xa0e9a74>
File: /usr/lib/python2.7/subprocess.py
Definition: subprocess.check_output(*popenargs, **kwargs)
Docstring:
Run command with arguments and return its output as a byte string.
If the exit code was non-zero it raises a CalledProcessError. The
CalledProcessError object will have the return code in the returncode
attribute and output in the output attribute.
The arguments are the same as for the Popen constructor.