14

subprocess.popen()を使用してio.BytesIO()バイトストリームを別のプログラムにパイプしようとしていますが、これがどのように可能か、または可能かどうかはわかりません。ドキュメントと例はすべてテキストと改行に関するものです。

私がこのようなものを作るとき:

import io
from subprocess import *

stream = io.BytesIO()
someStreamCreatingProcess(stream)

command = ['somecommand', 'some', 'arguments']  
process = Popen(command, stdin=PIPE)
process.communicate(input=stream)

私は得る

Traceback (most recent call last):
  File "./test.py", line 9, in <module>
    procOut         = process.communicate(input=stream)
  File "/usr/lib/python2.7/subprocess.py", line 754, in communicate
    return self._communicate(input)
  File "/usr/lib/python2.7/subprocess.py", line 1322, in _communicate
    stdout, stderr = self._communicate_with_poll(input)
  File "/usr/lib/python2.7/subprocess.py", line 1384, in _communicate_with_poll
    chunk = input[input_offset : input_offset + _PIPE_BUF]
TypeError: '_io.BytesIO' object has no attribute '__getitem__'

popen()はテキスト専用だと思います。私が間違っている?
これを行う別の方法はありますか?

4

2 に答える 2

6

によるとsubprocess.Popen.communicate

オプションの入力引数は、子プロセスに送信する文字列にするか、データを子プロセスに送信しない場合は None にする必要があります。


BytesIOオブジェクトから (バイト) 文字列値を取得するには、次を使用しgetvalueます。

process.communicate(input=stream.getvalue())
于 2013-12-02T04:55:24.180 に答える