为什么我无法将所有数据从sys.stdin写入Windows中的文件?

问题描述:

我想在Windows XP上使用Python 2.7从sys.stdin中读取二进制数据。二进制数据是一个由foobar2000解码的WAV文件。通常情况下,这些数据将发送到命令行编码器,例如stdin上的lame.exe,在这里处理并写入输出文件,其名称在命令行参数中提供。我试图截取输出的WAV数据并将其发送到另一个文件。但是,在流水线显然崩溃之前,我只能从stdin获得几KB,所以我只剩下一个很短的(大约75 KB)WAV文件,而不是我期望的几十兆字节。什么可能导致这种情况?我一直小心地打开sys.stdin和输出文件作为二进制文件。为什么我无法将所有数据从sys.stdin写入Windows中的文件?

from __future__ import print_function 
import os 
import os.path 
import sys 

sys.stdin = os.fdopen(sys.stdin.fileno(), 'rb', 0) # Make sys.stdin binary 

wave_fname = os.path.join(os.environ['USERPROFILE'], 'Desktop', 
    'foobar_test.wav') 

try: 
    os.remove(wave_fname) 
except Exception: 
    pass 

CHUNKSIZE = 8192 
wave_f = open(wave_fname, 'wb') 
try: 
    bytes_read = sys.stdin.read(CHUNKSIZE) 
    while bytes_read: 
     for b in bytes_read: 
      wave_f.write(b) 
     bytes_read = sys.stdin.read(CHUNKSIZE) 
finally: 
    pass 
wave_f.close() 

建议:也许你需要使用msvcrt.setmode(fd, flags)其中fdsys.stdin.fileno()

+0

,完美的工作,但为什么不os.fdopen(sys.stdin.fileno(), 'RB',0)工作? – telotortium 2010-08-16 23:38:23

+0

@ ascent1729:可能是因为它正在将文本模式下打开的底层文件中的字节应用到“b”(太晚)。使用'msvcrt.setmode'将其更改为二进制模式。 – 2010-08-16 23:50:28