>我正在使用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。
问题仍然是这是否是一个好主意。我认为一个如此关键地依赖于缓冲量的实现是非常不可靠的。