我正在尝试使用 subprocess.popen() 管道 io.BytesIO() bytetream到一个单独的程序,但我不知道这是怎么回事。文档和示例都是关于文本和换行的。
当我掀起这样的事情时:
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()仅适用于文字。我错了吗? 有没有不同的方法来做到这一点?
答案 0 :(得分:6)
作为@falsetru said,您无法直接传输BytesIO()
个对象;你需要先从它获得一个字节串。这意味着,在致电stream
以传递给stream.getvalue()
之前,所有内容都应已写入process.communicate()
。
如果你想 stream 而不是一次提供所有输入,那么你可以删除BytesIO()
对象并直接写入管道:
from subprocess import Popen, PIPE
process = Popen(['command', 'arg1'], stdin=PIPE, bufsize=-1)
someStreamCreatingProcess(stream=process.stdin) # many `stream.write()` inside
process.stdin.close() # done (no more input)
process.wait()
在完成写入流之前, someStreamCreatingProcess()
不应该返回。如果它立即返回,那么它应该在将来的某个时刻调用stream.close()
(在代码中删除process.stdin.close()
):
from subprocess import Popen, PIPE
process = Popen(['command', 'arg1'], stdin=PIPE, bufsize=-1)
someStreamCreatingProcess(stream=process.stdin) # many `stream.write()` inside
process.wait() # stream.close() is called in `someStreamCreatingProcess`
答案 1 :(得分:5)
根据subprocess.Popen.communicate
:
可选输入参数应为要发送给子项的字符串 如果没有数据应该发送给孩子,则处理或无。
要从BytesIO
对象获取(字节)字符串值,请使用getvalue
:
process.communicate(input=stream.getvalue())