如何读取执行的shell命令的输出?

时间:2013-03-30 10:39:26

标签: python python-2.7

我已经阅读了很多关于这个主题的问题,甚至有两个已经接受了答案的问题,然后在评论中出现了与我所遇到的相同的问题。

所以我想要做的是捕获这个命令的输出(在命令行中工作)

 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安装上)?

3 个答案:

答案 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.