我使用Popen打开tclsh,并尝试运行puts aaaaaaaaaaa...命令(aaa...非常长)通过管道发送命令
它工作得很好,但是,当我运行该命令两次时(aaaaa...需要足够长的时间),如果我通过管道读取stdout,代码将挂起
我试着放大默认的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'))最后,我使用tempfile代替了stdout中的管道
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)发布于 2021-03-01 12:30:47
管道缓冲区不是无限大的。您填充了stdin缓冲区,然后tclsh填充了它的stdout缓冲区,直到您从stdout中取出一些东西,tclsh才能继续读取下一行。所以,你在第二次写入时被阻止了。
https://stackoverflow.com/questions/66415397
复制相似问题