2010-08-16 8 views
3

J'essaie de lire les données binaires de sys.stdin en utilisant Python 2.7 sur Windows XP. Les données binaires sont un fichier WAV décodé par foobar2000. Normalement, ces données sont envoyées à un encodeur de ligne de commande tel que lame.exe sur stdin, où elles sont traitées et écrites dans un fichier de sortie dont le nom est fourni dans les arguments de la ligne de commande. J'essaye d'intercepter les données de WAV qui sont produites et l'envoyons à un autre dossier. Cependant, je ne peux obtenir que quelques Ko de stdin avant que le pipeline ne s'effondre apparemment, et il ne me reste donc qu'un fichier WAV très court (environ 75 Ko), au lieu des quelques dizaines de mégaoctets que j'attends. Qu'est-ce qui pourrait en être la cause? J'ai pris soin d'ouvrir sys.stdin et le fichier de sortie en tant que fichiers binaires.Pourquoi ne puis-je pas écrire toutes les données de sys.stdin dans un fichier sous 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() 

Répondre

2

Suggestion: vous devez peut-être utiliser msvcrt.setmode(fd, flags)fd est sys.stdin.fileno()

+0

Cela a fonctionné à merveille, mais pourquoi ne pas os.fdopen (sys.stdin.fileno(), 'rb', 0) travail ? – telotortium

+0

@ ascent1729: Probablement parce qu'il applique '' b '' (trop tard) aux octets qu'il obtient du fichier sous-jacent, qui est ouvert en mode texte. L'utilisation de 'msvcrt.setmode' change cela en mode binaire. –

Questions connexes