2013-05-16 6 views
5

Eine Testdatei == == a.py, wie Bytes schreiben benannt nach 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 

Es ist in Ordnung, wenn es alleine läuft. Aber im folgenden Fall gibt es ein Problem:

  1. Führen Sie python a.py | mehr
  2. Drücken Sie Strg + c zu beenden

Dann habe ich Ausnahme OSError: OSError (22, 'Invalid argument') in < _io.TextIOWrapper name = '' mode = 'w' encoding = 'cp936' > ignoriert

Ich habe den OSError bereits um die os.sys.stdout.buffer-Operationen, aber es geht immer noch schief.

Wenn ich os.sys.stdout.buffer.flush nicht verwende, dann gibt es keine Fehlermeldung. Wenn ich nur print() benutze, ist alles in Ordnung.

Wie also Bytes korrekt in die Stdout schreiben?

Ich benutze Windows 7 64 Bit und Python 3.3.0 32 Bit.

+3

möglich Duplikat [? Wie Binärdaten in stdout in Python 3 schreiben] (http://stackoverflow.com/questions/908331/how-to-write-binary-data -in-stdout-in-python-3) –

Antwort

9

Sie können os.fdopen verwenden, um stdout mit anderem Modus erneut zu öffnen. Sie können die Dateinummer für stdout mit sys.stdout.fileno() abrufen.

Beispiel:

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