2011-12-13 19 views
6

Estoy teniendo un problema cuando se producen errores cuando trato de ejecutar este código con Python 3.2.2cadenas de formato para stdin.write() en Python 3.x

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

working_file.stdin.write('message') 

entiendo que Python 3 cambió la forma en que maneja las cadenas, pero no entiendo cómo formatear el 'mensaje'. ¿Alguien sabe cómo cambiaría este código para que sea válido?

muchas gracias

Jon

actualización: aquí está el mensaje de error que consigo

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

Usted Olvidé el mensaje de error. –

Respuesta

2

es su "TypeError: 'str' no es compatible con la interfaz de búfer" mensaje de error? Ese mensaje de error te dice exactamente lo que está mal. No escribes objetos de cadena en ese sdtin. Entonces, ¿qué escribes? Bueno, cualquier cosa que soporte la interfaz del búfer. Normalmente esto es objetos de bytes.

igual:

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

Estoy de acuerdo con la respuesta anterior (excepto para el "el mensaje de error que dice exactamente lo que está mal" parte), pero me gustaría para completarlo. Si el caso es que tiene una cadena que desea escribir en el tubo (y no un objeto bytes), tiene dos opciones:

1) codifican cada cuerda primero antes de que se escriben a la tubería:

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

2) Envolver el tubo en una interfaz de texto tamponada que va a hacer la codificación:

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

(Observe que la E/S está amortiguada, por lo que puede que tenga que llamar a stdin_wrapper.flush() .)