1

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

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

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

4

3 回答 3

6

我相信你需要做的就是改变,

output = Popen(['sudo /usr/bin/atq'], stdout=PIPE)

output = Popen(['sudo', '/usr/bin/atq'], stdout=PIPE)

当我在列表中包含多个参数作为单个字符串时,我得到了同样的错误args

于 2013-03-30T10:47:08.363 回答
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.

于 2013-03-30T10:46:22.167 回答
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.
于 2013-03-30T10:46:46.593 回答