2011-12-13 15 views
6

Sto avendo un problema in cui si verificano errori quando si tenta di eseguire questo codice con Python 3.2.2stringhe di formattazione per stdin.write() in pitone 3.x

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

working_file.stdin.write('message') 

Capisco che Python 3 cambiato il modo in cui gestisce le stringhe, ma non capisco come formattare il 'messaggio'. Qualcuno sa come cambierei questo codice per essere valido?

molte grazie

Jon

aggiornamento: heres il messaggio di errore ottengo

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

Tu dimenticato il messaggio di errore. –

risposta

2

È il vostro messaggio di errore "TypeError: 'str' non supporta l'interfaccia di buffer"? Quel messaggio di errore ti dice praticamente esattamente cosa c'è che non va. Non scrivere oggetti stringa su tale sdtin. Allora, cosa scrivi? Bene, qualsiasi cosa supporti l'interfaccia del buffer. In genere si tratta di oggetti byte.

come:

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

Sono d'accordo con la risposta precedente (fatta eccezione per il "il messaggio di errore ti dice esattamente ciò che è sbagliato" parte), ma mi piacerebbe per completarlo. Se il caso è che avete una stringa che si desidera scrivere nel tubo (e non un oggetto di byte), si hanno due scelte:

1) la codifica ogni corda prima prima di scrivere al tubo:

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

2) Avvolgere il tubo in un interfaccia testuale tamponata che farà la codifica:

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

(si noti che l'I/O è ora tamponata, quindi potrebbe essere necessario chiamare stdin_wrapper.flush() .)

Problemi correlati