我正在为命令行可执行文件(子程序)编写 Python 包装脚本(childscript.py)。另一个可执行文件(父程序)生成 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()
我能够从父程序中获取所有输出并将其提供给子程序。
但是,如果我尝试通过执行以下操作来使用编解码器模块:
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())
并尝试进行读取,读取不会从父程序获得所有输出。如果我强制从父程序进行额外输出,丢失的位会与我推入的部分额外输出一起出现。当我使用编解码器模块时,childscript.py 似乎没有读取它提供给它的所有内容。
我做错了什么吗?如果没有编解码器,childscript.py 会在从 parentprogram 显示 iso-8859-1 编码的内容时触发异常。
编辑:
我发现 Python v3.x“open”也可以采用编码选项。我将这一行改为使用“open”而不是“codecs.open”:
sys.stdin = open(sys.stdin.fileno(), encoding='iso-8859-1', mode='r')
它按预期工作,没有 open.codecs 产生的任何问题。我已将脚本切换为使用“打开”。
如果有人可以解释为什么编解码器模块的行为不同,我将不胜感激。