将输入传递给shell命令时的Python stdin缓冲问题

时间:2018-03-23 18:29:05

标签: python input

我使用Python 3运行以下脚本:

import sys, subprocess

line = sys.stdin.readline()
print(f'[p] {line}', end='')
subprocess.run('read one; echo "[s] $one"', shell=True)
line = sys.stdin.readline()
print(f'[p] {line}', end='')

如果我正常运行此脚本,就会发生这种情况,如我所料:

a
[p] a
b
[s] b
c
[p] c

(我输入了三行,每行一个字母)。但是,如果我创建一个包含这三行的文本文件,并使用python3 script.py < file.txt运行它,我会得到以下输出:

[p] a
[s]
[p] b

当我希望得到

[p] a
[s] b
[p] c

我很确定这是由于stdin缓冲问题造成的。我已尝试(无效)设置PYTHONUNBUFFERED,并使用-u运行Python。我可以禁用stdin缓冲吗?或者我可以访问缓冲区的内容以将它们传递给我的shell命令吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

这是一个缓冲问题,我认为io模块文档中的这一陈述是相关的:

&#34; TextIOWrapper,扩展它[谈论TextIOBase],是缓冲原始流的缓冲文本接口&#34;

sys.stdin的类型是TextIOWrapper,所以看起来缓冲不能只使用sys.stdin

但是,似乎你可以这样做:

import io
f = io.FileIO(sys.stdin.fileno())

然后执行f.readline(),无论您是否指定-u。

问题仍然是这是否是一个好主意。我认为一个严格依赖于缓冲多少的实现是非常不可靠的。