【问题标题】:Python subprocess Popen readline before closing stdinPython子进程在关闭stdin之前打开readline
【发布时间】:2020-09-07 05:15:00
【问题描述】:
import subprocess as sp

p = sp.Popen("/bin/cat", stdin=sp.PIPE, stdout=sp.PIPE)

p.stdin.write(b"foobaz!\n")
p.stdin.close()
print(p.stdout.readline())

此代码按预期工作(cat 回显标准输入,我们可以读取标准输出)

如果我们注释掉p.stdin.close().readline() 会无限期地阻塞。这与调用 .read(1) 的行为相同。有没有办法在不发送 EOF 到标准输入的情况下使用 subprocess 模块读取?

我知道还有其他库可以解决我的问题,我也在研究它们。对于这个问题,我只是好奇subprocess是否有这个能力,以及如何通过subprocess实现。

【问题讨论】:

    标签: python subprocess pipe


    【解决方案1】:

    问题在于缓冲。如果你也使用universal_newlines=True,你可以使用bufsize=1(尽管你会写字符串而不是字节):

    p = sp.Popen("/bin/cat", stdin=sp.PIPE, stdout=sp.PIPE, 
                 bufsize=1, universal_newlines=True)
    p.stdin.write("foobaz!\n")
    print(p.stdout.readline())
    

    以上内容在 Python 3.5.2 中进行了测试。注意 - 我刚刚阅读了一个无关问题的答案,该答案表明在较新的 Python 版本中text=True 等同于 universal_newlines=True,但在撰写本文时没有更新的安装来尝试它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 2011-11-21
      • 2011-12-30
      • 1970-01-01
      • 2015-04-12
      • 2011-05-11
      相关资源
      最近更新 更多