使用Python编解码器会导致系统标准?

2024-04-19 06:31:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

如果儿童脚本.py从系统标准直接使用readline:

^{pr2}$

我可以从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获得所有输出。如果我从parentprogram强制执行附加输出,那么丢失的位会随着我输入的附加输出的一部分一起出现。看起来像儿童脚本.py当我使用编解码器模块时,不会读取提供给它的所有内容。在

我是不是做错了什么?没有编解码器,儿童脚本.py当显示来自parentprogram的iso-8859-1编码的内容时触发异常。在

编辑:
我发现pythonv3.x“open”也可以使用编码选项。我改成用“open”代替“open”编解码器.打开“:

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

它像预期的那样工作,没有任何问题打开.codecs生产。我把我的脚本改为使用“open”。在

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


Tags: 模块py脚本none可执行文件编解码器stdinsys
2条回答

试试这个:

import sys
import os

fd = sys.stdin.fileno()
text = ''
while 1:
    try:
        raw_data = os.read(fd, 1024)
        text += unicode(raw_data, 'iso-8859-1')
        # now do something with text
    except (EOFError, KeyboardInterrupt):
        break

这样可以避免使用readline(),这将对非ascii字符发出错误,但仍然可以使用非阻塞读取。在

唯一的问题是您必须自己将输入分离成行。在

刷新父级中的输出通道。在

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

相关问题 更多 >