2013-05-16 8 views
5

plik testowy o nazwie == a.py ==Jak napisać bajtów do stdout w 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 

Jest ok, gdy pracuje on sam. Ale występuje problem w następującym przypadku:

  1. Uruchom python a.py | bardziej
  2. nacisnąć klawisze Ctrl + C wyjść

Następnie mam wyjątku OSError: OSError (22 'nieprawidłowy argument') w < nazwą _io.TextIOWrapper = '' = tryb 'W' kodowania '=' cp936 > zignorowano:

Złapałem OSError już wokół operacji os.sys.stdout.buffer, ale nadal nie działa.

Jeśli nie używam os.sys.stdout.buffer.flush, to nie ma komunikatu o błędzie. Jeśli po prostu używam print(), wszystko jest w porządku.

Jak poprawnie zapisać bajty na stdout?

Używam Windows 7 64-bitowy i Python 3.3.0 32-bitowy.

+3

możliwe duplikat [? Jak napisać danych binarnych w stdout w python 3] (http://stackoverflow.com/questions/908331/how-to-write-binary-data -in-stdout-in-python-3) –

Odpowiedz

9

Możesz użyć os.fdopen, aby ponownie otworzyć standardowe wyjście w innym trybie. Możesz uzyskać numer pliku dla stdout z sys.stdout.fileno().

Przykład:

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