使用IronPython将二进制数据写入stdout

时间:2010-07-30 20:23:31

标签: python character-encoding ironpython stdout

我有两个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一起工作)
  • 我无法使用this solution,因为IronPython不支持msvcrt
  • 使用Python 3.x,您可以通过stdout访问无缓冲的sys.stdout.buffer;这在2.6
  • 中不可用
  • os.fdopen(sys.stdout.fileno(), 'wb', 0)只需在stdout模式
  • 中返回'w'

所以是的,任何想法?此外,如果有更好的方式来传输不使用stdout的二进制数据,我当然愿意接受建议。

1 个答案:

答案 0 :(得分:0)

sys.stdout只是一个与sys.__stdout__

相同的变量

因此,只需以二进制模式打开文件,将文件分配给sys.stdout并使用它。如果您再次需要真正的正常标准输出,则可以使用

获取
sys.stdout = sys.__stdout__