2010-06-14 22 views
11

Python 2.6'dan Python'un subprocess modülünden pipe.communicate numaralı telefonu arıyorum. pipe.communicate() bekliyor, çünkü bu oluyorpipe.communicate için kodlama Python

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) 

sanırım: Bu koddan aşağıdaki hatayı alıyorum:

from subprocess import Popen 

pipe = Popen(cwd) 

pipe.communicate(data) 

keyfi cwd yüzünden ve bu unicode (özellikle 0xE9) ihtiva ettiği data ASCII kodlanmış dize, ancak data unicode'dur.

Bu karşılaştığım sorun mu?için unicode geçirmenin bir yolu var mı?

Okuduğunuz için teşekkür ederiz!

Brian

+0

"Unicode içerir" ile ne demek istiyorsunuz? Özellikle, 0xE9, tek başına herhangi bir ortak kodlamada geçerli bir Unicode kod noktası değildir. – tripleee

cevap

14

Ben değiştirerek bu çözmüş olabiliriz:

pipe.communicate(data) 

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

ben düzeltilmesi durmalarına rağmen

için!

Brian

+2

Doğru. Borular (ve dosyalar, soketler, vb.), Unicode ("karakter" olan) değil baytları iletir. Aktarmak için Unicode kodlamalısınız. –

+0

Teşekkürler! Bu, Django ile yaşadığım bir sorunu çözdü - formlarımdan biri alt işlem yoluyla harici bir işlemciye aktarıldı ve Unicode gönderimleri, bu değiştirilene kadar başarısız oldu. – maroonmed

İlgili konular