gpt4 book ai didi

python - 使用 Python 编解码器会导致 sys.stdin 的 readline 问题?

转载 作者:行者123 更新时间:2023-11-28 18:52:19 27 4
gpt4 key购买 nike

我正在为命令行可执行文件 (childprogram) 编写 Python 包装器脚本 (childscript.py)。另一个可执行文件 (parentprogram) 生成 childscript.py 并将输出通过管道传输到 childscript.py。 childscript.py 生成子程序:

    retval = subprocess.Popen(RUNLINE, shell=False, stdout=None, stderr=None, stdin=subprocess.PIPE)

如果 childscript.py 使用 readline 直接从 sys.stdin 进行一系列读取:

line = sys.stdin.readline()

我能够从 parentprogram 获取所有输出并将其提供给 childprogram。

但是,如果我尝试通过以下方式使用编解码器模块:

sys.stdin = codecs.open(sys.stdin.fileno(), encoding='iso-8859-1', mode='rb', buffering=0)

或者做一个:

sys.stdin = codecs.getreader('iso-8859-1')(sys.stdin.detach())

并尝试进行读取,读取并没有获得父程序的所有输出。如果我从 parentprogram 强制额外输出,丢失的位会与我插入的部分额外输出一起出现。看起来 childscript.py 没有读取我使用编解码器模块时提供给它的所有内容。

我做错了什么吗?如果没有编解码器,childscript.py 在显示来自父程序的 iso-8859-1 编码内容时会触发异常。

编辑:
我发现 Python v3.x“open”也可以采用编码选项。我将行更改为使用“open”而不是“codecs.open”:

      sys.stdin = open(sys.stdin.fileno(), encoding='iso-8859-1', mode='r')

它按预期工作,没有任何 open.codecs 产生的问题。我已将我的脚本切换为使用“打开”。

如果有人能解释为什么 codecs 模块的行为不同,我将不胜感激。

最佳答案

刷新父级中的输出 channel 。

管道总是被缓冲的。通常的缓冲区大小是 4KB。与输出连接到控制台时不同,标准运行时不会在每一行之后为您刷新输出。

关于python - 使用 Python 编解码器会导致 sys.stdin 的 readline 问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10553773/

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