Python subprocess Popen readline before closing stdin
Python subprocess Popen readline before closing stdin
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
.
实现
问题出在缓冲上。如果您还使用 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
,但没有更新的安装来尝试它在撰写本文时。
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
.
问题出在缓冲上。如果您还使用 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
,但没有更新的安装来尝试它在撰写本文时。