将输入传递给 shell 命令时出现 Python 标准输入缓冲问题



>我正在使用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

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

谢谢!

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

"TextIOWrapper,它扩展了它[谈论TextIOBase],是一个缓冲文本接口到缓冲的原始流">

sys.stdin的类型是TextIOWrapper,因此似乎仅使用sys.stdin无法摆脱缓冲。

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

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

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

问题仍然是这是否是一个好主意。我认为一个如此关键地依赖于缓冲量的实现是非常不可靠的。

最新更新