我有两个Python脚本,我在Windows上使用IronPython 2.6在.NET 2.0上运行。一个输出二进制数据,另一个输出数据。我希望能够使用管道将数据从第一个传输到第二个。我在这里遇到的问题是,从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.因此,我认为问题是由'w'
模式下CP437编码和写入的组合引起的。在这种情况下,如果我可以强制stdout
使用二进制模式(我假设使用ASCII编码是不可能的,因为cmd.exe使用CP437),它将被解决。这就是我被困的地方;我找不到任何办法。
我发现一些不起作用的潜在解决方案:
ipy -u
似乎没有任何影响(我也测试过它是否会导致打印出Unix风格的换行符;它没有,所以我怀疑-u
没有完全不和IronPython一起工作)msvcrt
stdout
访问无缓冲的sys.stdout.buffer
;这在2.6 os.fdopen(sys.stdout.fileno(), 'wb', 0)
只需在stdout
模式'w'
所以是的,任何想法?此外,如果有更好的方式来传输不使用stdout
的二进制数据,我当然愿意接受建议。
答案 0 :(得分:0)
sys.stdout
只是一个与sys.__stdout__
因此,只需以二进制模式打开文件,将文件分配给sys.stdout并使用它。如果您再次需要真正的正常标准输出,则可以使用
获取sys.stdout = sys.__stdout__