我可以将io.BytesIO()流传输到Python中的subprocess.popen()吗?
问题内容:
我想 管 一 io.BytesIO() bytetream到一个单独的程序使用 subprocess.popen()
,但我不知道如何,或者如果这是在所有可能的。文档和示例都是关于文本和换行符的。
当我鞭打这样的事情:
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() 仅用于文本。我错了吗?
有其他方法可以做到吗?
问题答案:
正如@falsetru所说,您不能BytesIO()
直接流对象;您需要先从中获取一个字节串。这意味着stream
在 调用stream.getvalue()
传递给 之前 ,所有内容都应已经写入process.communicate()
。
如果要 流传输 而不是一次提供所有输入,则可以删除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`