将输入传递到shell命令时Python stdin缓冲问题
我正在使用Python 3运行以下脚本:将输入传递到shell命令时Python stdin缓冲问题,python,input,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]
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
(我打了三行字,每行上只有一个字母)。但是,如果我创建一个包含这三行的文本文件,并使用python3script.py
运行它,我会得到以下输出:
[p] a
[s]
[p] b
当我期望得到
[p] a
[s] b
[p] c
我相当肯定这是由于stdin缓冲问题造成的。我尝试过设置pythonunbuffer
,并使用-u
运行Python,但没有效果。我可以禁用stdin缓冲吗?或者我可以访问缓冲区的内容以将其传递给shell命令吗
谢谢 这是一个缓冲问题,我认为
io
模块文档中的这句话是相关的:
TextIOWrapper扩展了它[谈论TextIOBase],它是缓冲原始流的缓冲文本接口
sys.stdin
的类型是TextIOWrapper,因此似乎仅仅使用sys.stdin
无法摆脱缓冲
但是,您似乎可以做到这一点:
import io
f = io.FileIO(sys.stdin.fileno())
然后执行f.readline()
,这与是否指定-u无关
问题在于这是否是一个好主意。我认为一个非常依赖缓冲区大小的实现是非常不可靠的。您似乎至少运行了python 3.5。我试过使用Python2,结果,-u和您的代码确实起到了作用。