1. ホーム
  2. パイソン

[解決済み】subprocess.call()の出力を取得する【重複あり

2022-03-29 20:08:15

質問

を使用して実行したプロセスの出力を取得するには、どうすればよいですか? subprocess.call() ?

を渡すと StringIO.StringIO オブジェクトを stdout を実行すると、このようなエラーが発生します。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/subprocess.py", line 444, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/subprocess.py", line 588, in __init__
    errread, errwrite) = self._get_handles(stdin, stdout, stderr)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/subprocess.py", line 945, in _get_handles
    c2pwrite = stdout.fileno()
AttributeError: StringIO instance has no attribute 'fileno'
>>> 

解決方法は?

からの出力 subprocess.call() はファイルにのみリダイレクトされるべきです。

を使用する必要があります。 subprocess.Popen() の代わりに そうすると subprocess.PIPE を使い、パイプから読み込むことができます。 communicate() メソッドを使用します。

from subprocess import Popen, PIPE

p = Popen(['program', 'arg1'], stdin=PIPE, stdout=PIPE, stderr=PIPE)
output, err = p.communicate(b"input data that is passed to subprocess' stdin")
rc = p.returncode

で使用されるファイルのようなオブジェクトが、その理由です。 subprocess.call() は実際のファイルディスクリプタを持つ必要があり、そのために fileno() メソッドを使用します。ファイルのようなオブジェクトを使用するだけでは、うまくいきません。

参照 ここで をご覧ください。