首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python Popen挂起

python Popen挂起
EN

Stack Overflow用户
提问于 2021-03-01 08:54:21
回答 1查看 39关注 0票数 0

我使用Popen打开tclsh,并尝试运行puts aaaaaaaaaaa...命令(aaa...非常长)通过管道发送命令

它工作得很好,但是,当我运行该命令两次时(aaaaa...需要足够长的时间),如果我通过管道读取stdout,代码将挂起

我试着放大默认的bufsize,但是它不起作用

到底发生了什么?有人能帮上忙吗?

代码语言:javascript
复制
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中的管道

代码语言:javascript
复制
    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)

.

代码语言:javascript
复制
    self._tempfile_out.read1(1)
EN

回答 1

Stack Overflow用户

发布于 2021-03-01 12:30:47

管道缓冲区不是无限大的。您填充了stdin缓冲区,然后tclsh填充了它的stdout缓冲区,直到您从stdout中取出一些东西,tclsh才能继续读取下一行。所以,你在第二次写入时被阻止了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66415397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档