为什么我无法将所有数据从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)
其中fd
是sys.stdin.fileno()
,完美的工作,但为什么不os.fdopen(sys.stdin.fileno(), 'RB',0)工作? – telotortium 2010-08-16 23:38:23
@ ascent1729:可能是因为它正在将文本模式下打开的底层文件中的字节应用到“b”(太晚)。使用'msvcrt.setmode'将其更改为二进制模式。 – 2010-08-16 23:50:28