用IronPython将二进制数据写入标准输出

用IronPython将二进制数据写入标准输出,python,character-encoding,ironpython,stdout,Python,Character Encoding,Ironpython,Stdout,我有两个Python脚本,在Windows上运行,在.NET2.0上运行IronPython2.6。一个输出二进制数据,另一个处理数据。我希望能够使用管道将数据从第一个传输到第二个。我在这里遇到的问题是,当从Windows命令行运行时,sys.stdout使用CP437字符编码和文本模式而不是二进制模式“w”而不是“wb”。这会导致某些大于127的字节被写入错误的字符,即不同的字节值在输出中产生相同的字符,因此脚本读取它们时无法区分 例如,此脚本将同一个字符以下划线打印两次: import sy

我有两个Python脚本,在Windows上运行,在.NET2.0上运行IronPython2.6。一个输出二进制数据,另一个处理数据。我希望能够使用管道将数据从第一个传输到第二个。我在这里遇到的问题是,当从Windows命令行运行时,sys.stdout使用CP437字符编码和文本模式而不是二进制模式“w”而不是“wb”。这会导致某些大于127的字节被写入错误的字符,即不同的字节值在输出中产生相同的字符,因此脚本读取它们时无法区分

例如,此脚本将同一个字符以下划线打印两次:

import sys
sys.stdout.write(chr(95))
sys.stdout.write(chr(222))
因此,当我试图读取数据时,我得到了与我最初编写的不同的东西

我编写此脚本是为了检查问题是以“w”模式写入还是编码:

import sys
str = chr(222)

# try writing chr(222) in ASCII in both write modes
# ASCII is the default encoding
open('ascii_w', 'w').write(str)
open('ascii_wb', 'wb').write(str)

# set encoding to CP437 and try writing chr(222) in both modes
reload(sys)
sys.setdefaultencoding("cp437")
open('cp437_w', 'w').write(str)
open('cp437_wb', 'wb').write(str)
运行该命令后,文件cp437_w包含字符95,其他三个文件分别包含字符222。因此,我认为问题是由CP437编码和以“w”模式写入的组合引起的。在这种情况下,如果我可以强制stdout使用二进制模式,那么问题就解决了。我假设,鉴于cmd.exe使用CP437,让它使用ASCII编码是不可能的。这就是我被困的地方;我找不到任何方法来做这件事

我发现一些潜在的解决方案不起作用:

运行ipy-u似乎没有任何效果,我还测试了它是否会导致Unix风格的换行符被打印出来;它没有,所以我怀疑-u根本不适用于IronPython 我无法使用,因为IronPython不支持msvcrt 使用Python3.x,您可以通过sys.stdout.buffer访问无缓冲的标准输出;这在2.6中不可用 os.fdopensys.stdout.fileno,“wb”,0仅在“w”模式下返回stdout 是的,有什么想法吗?另外,如果有更好的方式不使用标准输出来传输二进制数据,我当然愿意接受建议。

sys.stdout只是一个指向与sys相同内容的变量。\u stdout__

因此,只需以二进制模式打开一个文件,将该文件分配给sys.stdout并使用它。如果你再次需要真正的、正常的stdout,你可以用

sys.stdout = sys.__stdout__