我使用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命令吗?
谢谢!
答案 0 :(得分:1)
这是一个缓冲问题,我认为io
模块文档中的这一陈述是相关的:
&#34; TextIOWrapper,扩展它[谈论TextIOBase],是缓冲原始流的缓冲文本接口&#34;
sys.stdin
的类型是TextIOWrapper,所以看起来缓冲不能只使用sys.stdin
。
但是,似乎你可以这样做:
import io
f = io.FileIO(sys.stdin.fileno())
然后执行f.readline()
,无论您是否指定-u。
问题仍然是这是否是一个好主意。我认为一个严格依赖于缓冲多少的实现是非常不可靠的。