我正在写一个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”。在
如果有人能解释为什么编解码器模块有不同的行为,我将不胜感激。在
试试这个:
这样可以避免使用
readline()
,这将对非ascii字符发出错误,但仍然可以使用非阻塞读取。在唯一的问题是您必须自己将输入分离成行。在
刷新父级中的输出通道。在
管道总是缓冲的。通常的缓冲区大小是4KB。与输出连接到控制台时不同,标准运行时不会在每行之后刷新输出。在
相关问题 更多 >
编程相关推荐