2013-05-16 12 views
5

un file di test chiamato == == a.pybyte come scrivono allo stdout in python3.3

import os 

if __name__ == '__main__': 
    for x in range(0,1000): 
     try: 
      os.sys.stdout.buffer.write(b"hello\r\n") 
      os.sys.stdout.buffer.flush() 
     except OSError: 
      pass 

E 'ok quando viene eseguito da solo. Ma c'è un problema nel seguente caso:

  1. Esegui python a.py | più
  2. premere CTRL + C per uscire

Poi ho avuto Eccezione OSError: OSError (22, 'Invalid argument') in < nome _io.TextIOWrapper = '' mode = 'w' encoding = 'cp936' > ignorato

Ho rilevato l'OSError già attorno alle operazioni os.sys.stdout.buffer, ma continua a funzionare male.

Se non utilizzo os.sys.stdout.buffer.flush, non viene visualizzato alcun messaggio di errore. Se uso solo print(), tutto è OK.

Quindi, come scrivere byte allo stdout correttamente?

Sto usando Windows 7 a 64 bit e Python 3.3.0 a 32 bit.

+3

possibile duplicato di [? Come scrivere dati binari in stdout in python 3] (http://stackoverflow.com/questions/908331/how-to-write-binary-data -in-stdout-in-python-3) –

risposta

9

È possibile utilizzare os.fdopen per riaprire lo stdout con modalità diverse. È possibile ottenere il numero di file per lo stdout con sys.stdout.fileno().

Esempio:

>>> fp = os.fdopen(sys.stdout.fileno(), 'wb') 
>>> fp.write(b'Hello, world') 
12 
>>> sys.stdout.mode 
'w' 
>>> fp.mode 
'wb' 
>>> fp.flush() 
Hello, world>>> 
Problemi correlati