我有两个Python脚本,它们是在.net2.0上的ironpython2.6的Windows上运行的。一个输出二进制数据,另一个处理数据。我希望能够使用管道将数据从第一个流到第二个。我在这里遇到的问题是,当从Windows命令行运行时,sys.stdout
使用CP437字符编码和文本模式而不是二进制模式('w'
而不是'wb'
)。这会导致某些大于127的字节被写入错误的字符(即,不同的字节值在输出中产生相同的字符,因此读取它们的脚本无法区分)。在
例如,此脚本将同一字符(下划线)打印两次:
import sys
sys.stdout.write(chr(95))
sys.stdout.write(chr(222))
所以当我试着读数据的时候,我得到的东西和我最初写的不一样。在
我编写此脚本是为了检查问题是以'w'
模式编写的还是编码:
运行之后,文件cp437_w
包含字符95,其他三个分别包含字符222。因此,我认为这个问题是由CP437编码和以'w'
模式编写的组合造成的。在这种情况下,如果我可以强制stdout
使用二进制模式,那么这个问题就可以解决了(我假设让它使用ASCII编码是不可能的,因为命令行.exe使用CP437)。这就是我被困的地方;我找不到任何方法来做这件事。在
我发现一些可能的解决方案并不奏效:
ipy -u
似乎没有任何效果(我还测试了它是否会导致打印Unix风格的换行符;它没有,所以我怀疑-u
根本不适用于IronPython)msvcrt
stdout
到{os.fdopen(sys.stdout.fileno(), 'wb', 0)
只在'w'
模式下返回stdout
是的,有什么想法吗?另外,如果有更好的方法来流化二进制数据而不使用stdout
,我当然愿意接受建议。在
sys.stdout
只是一个变量,它指向与sys.__stdout__
相同的东西因此,只需在二进制模式下打开一个文件,将该文件分配给系统标准输出用它。如果你再需要一个真实的,正常的标准输出,你可以用它
相关问题 更多 >
编程相关推荐