2011-12-13 23 views
6

Mam problem gdzie pojawiają się błędy przy próbie wykonania tego kodu z Pythona 3.2.2ciągów formatowania stdin.write() w Pythonie 3.x

working_file = subprocess.Popen(["/pyRoot/iAmAProgram"], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) 

working_file.stdin.write('message') 

Rozumiem, że pyton 3 zmienił sposób, w jaki obsługuje łańcuchy, ale nie rozumiem, jak sformatować "wiadomość". Czy ktoś wie, jak zmienić ten kod, aby był ważny?

wiele dzięki

Jon

zmiana: herezje komunikat o błędzie i dostać

Traceback (most recent call last): 
    File "/pyRoot/goRender.py", line 18, in <module> 
    working_file.stdin.write('3') 
TypeError: 'str' does not support the buffer interface 
+0

You zapomniałem o błędzie. –

Odpowiedz

2

Czy Twój komunikat o błędzie "Błąd typu: 'str' nie obsługuje interfejsu bufora"? Ten komunikat o błędzie informuje dokładnie o tym, co jest nie tak. Nie piszesz obiektów typu string do tego sdtin. Więc co piszesz? Cokolwiek, co wspiera interfejs bufora. Zazwyczaj są to obiekty bajtów.

odczuwalna:

working_file.stdin.write(b'message') 
7

zgadzam się z poprzednią odpowiedź (z wyjątkiem „komunikat o błędzie mówi dokładnie to, co się dzieje” części), ale chciałbym, aby ją zakończyć. Jeśli sprawa jest to, że masz ciąg, który chcesz napisać do rury (a nie przedmiot bajtów), masz dwie możliwości:

1) Koduje każdy ciąg najpierw przed zapisać je do rury:

working_file.stdin.write('message'.encode('utf-8')) 

2) owinąć rurę do buforowanego interfejsu tekstowym zrobi kodowania:

stdin_wrapper = io.TextIOWrapper(working_file.stdin, 'utf-8') 
stdin_wrapper.write('message') 

(zauważyć, że urządzenie we/wy jest obecnie buforowane, więc może być konieczne, aby wywołać stdin_wrapper.flush() .)

Powiązane problemy