python Popen挂起

问题描述

我使用 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'))

最后,我在标准输出中使用临时文件而不是 PIPE

    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 填充了它的标准输出缓冲区,并且在您从标准输出中提取某些内容之前,它无法继续读取下一行。因此,您在第二次写入时被阻止。