Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将输入传递到shell命令时Python stdin缓冲问题_Python_Input - Fatal编程技术网

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

将输入传递到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]

我正在使用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
(我打了三行字,每行上只有一个字母)。但是,如果我创建一个包含这三行的文本文件,并使用
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和您的代码确实起到了作用。