2010-07-30 66 views
0

我有兩個Python腳本,我使用.NET 2.0上的IronPython 2.6在Windows上運行。一個輸出二進制數據,另一個處理數據。我希望能夠使用管道將數據從第一個數據流到第二個數據。我遇到的問題是,從Windows命令行運行時,sys.stdout使用CP437字符編碼和文本模式而不是二進制模式('w'而不是'wb')。這導致一些大於127的字節被寫爲錯誤的字符(即,不同的字節值在輸出中產生相同的字符並且因此通過讀取它們的腳本而無法區分)。使用IronPython將二進制數據寫入stdout

例如,該腳本打印相同的字符(下劃線)兩次:

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因爲msvcrt IronPython中
  • 與Python 3.x的不支持,你可以通過訪問sys.stdout.buffer緩衝stdout;這是不是在2.6
  • os.fdopen(sys.stdout.fileno(), 'wb', 0)可只返回stdout'w'模式

所以,是的,任何想法?另外,如果有更好的流式傳輸不使用stdout的二進制數據的方式,我肯定會接受建議。

回答

0

sys.stdout只是指向同樣的事情sys.__stdout__

因此一個變量,只需打開二進制模式下的文件,分配到sys.stdout來,並用它的文件。如果您再次需要真正的標準stdout,您可以使用

sys.stdout = sys.__stdout__