2010-06-14 23 views
11

Llamo a pipe.communicate desde el módulo subprocess de Python desde Python 2.6. Me sale el siguiente error de este código:Codificación de Python para pipe.communicate

from subprocess import Popen 

pipe = Popen(cwd) 

pipe.communicate(data) 

Para una arbitraria cwd, y donde data que contiene Unicode (específicamente 0xE9):

Exec. exception: 'ascii' codec can't encode character u'\xe9' in position 507: ordinal not in range(128) 
Traceback (most recent call last): 

... stdout, stderr = pipe.communicate(data) 

    File 
"/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/subprocess.py", 
line 671, in communicate 
    return self._communicate(input) 

    File 
"/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/subprocess.py", 
line 1177, in _communicate 
    bytes_written = os.write(self.stdin.fileno(), chunk) 

Esto está sucediendo, supongo, porque pipe.communicate() espera Cadena codificada en ASCII, pero data es unicode.

¿Es este el problema que estoy encontrando, y tengo una manera de pasar unicode a pipe.communicate()?

¡Gracias por leer!

Brian

+0

¿Qué quiere decir con "contiene Unicode"? Específicamente, 0xE9 no es, por sí mismo, un punto de código Unicode válido en cualquier codificación común. – tripleee

Respuesta

14

I puede haber resuelto esto cambiando:

pipe.communicate(data) 

a

pipe.communicate(data.encode('utf8')) 

Aunque me paro ser corregido!

Brian

+2

Eso es correcto. Las tuberías (y los archivos, conectores, etc.) transmiten bytes, no Unicode (que son "caracteres"). Tienes que codificar Unicode para transmitirlo. –

+0

Gracias! Esto solucionó un problema que tenía con Django: uno de mis formularios se pasa a un procesador externo a través de un subproceso, y los envíos Unicode seguían fallando hasta que esto se cambiara. – maroonmed

Cuestiones relacionadas