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

Popensubprocess出力を取得するために必要なハンドルを返しますcommunicate。注 - を追加すると、 だけでなく にもstderr=PIPEアクセスできます。STDERRSTDOUT

于 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 に答える