gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:58:13 26 4
gpt4 key购买 nike

我正在使用 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],是缓冲原始流的缓冲文本接口(interface)”

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

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

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

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

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

关于将输入传递给 shell 命令时 Python stdin 缓冲问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49456237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com