问题描述
我使用 Popen 打开 tclsh,并尝试通过 PIPE 发送命令来运行 puts aaaaaaaaaaa...
命令(aaa...很长)
它工作正常,但是,当我运行命令两次(aaaa...需要足够长的时间)并且我通过 PIPE 读取标准输出时,代码将挂起
我试图扩大默认的 bufsize,但它不起作用
钩子下面发生了什么?有人可以帮忙吗?
proc = Popen(
['C:\\Tcl\\bin\\tclsh.exe'],stdin=PIPE,stdout=PIPE,stderr=PIPE
)
proc.stdin.write(bytearray('puts ' + 'a' * 100000 + 'ends\n','utf-8'))
proc.stdin.write(bytearray('puts ' + 'a' * 100000 + 'ends\n','utf-8'))
proc.stdin.flush()
stdout = b''
while proc.poll() == None:
if stdout.endswith(b'ends'):
break
else:
stdout += proc.stdout.read1(1)
print(stdout.decode('utf-8'))
self._tempfile = tempfile.mktemp()
self._tempfile_in = open(self._tempfile,'wb')
self._tempfile_out = open(self._tempfile,'rb')
self._process = subprocess.Popen(
[self.tcl_exe] + list(self.tcl_exe_args),stdin = subprocess.PIPE,stdout = self._tempfile_in,stderr = subprocess.PIPE)
......
self._tempfile_out.read1(1)
解决方法
管道缓冲区不是无限大的。您填充了标准输入缓冲区,然后 tclsh 填充了它的标准输出缓冲区,并且在您从标准输出中提取某些内容之前,它无法继续读取下一行。因此,您在第二次写入时被阻止。