2010-06-14 16 views
11

Sto chiamando pipe.communicate dal modulo Python subprocess da Python 2.6. Ottengo il seguente errore da questo codice:Codifica Python per pipe.communicate

from subprocess import Popen 

pipe = Popen(cwd) 

pipe.communicate(data) 

Per un arbitrario cwd, e dove data che contiene unicode (in particolare 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) 

Questo sta accadendo, presumo, perché pipe.communicate() si aspetta Stringa codificata ASCII, ma data è unicode.

È questo il problema che sto incontrando e ho trovato un modo per passare l'unicode a pipe.communicate()?

Grazie per la lettura!

Brian

+0

Che cosa intendi per "contiene Unicode"? In particolare, 0xE9 non è, di per sé, un punto di codice Unicode valido in qualsiasi codifica comune. – tripleee

risposta

14

I può aver risolto questo cambiando:

pipe.communicate(data) 

a

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

Anche se sto essere corretti!

Brian

+2

Esatto. I pipe (e file, socket, ecc.) Trasmettono byte, non Unicode (che è "caratteri"). Devi codificare Unicode per trasmetterlo. –

+0

Grazie! Questo ha risolto un problema che stavo riscontrando con Django: una delle mie forme è passata a un processore esterno tramite sottoprocesso e le presentazioni Unicode continuavano a fallire fino a quando non veniva modificata. – maroonmed