2010-06-14 6 views
11

के लिए पायथन एन्कोडिंग मैं पाइथन 2.6 से पाइथन के subprocess मॉड्यूल से pipe.communicate पर कॉल कर रहा हूं। मैं इस कोड से निम्न त्रुटि मिलती है:pipe.communicate

from subprocess import Popen 

pipe = Popen(cwd) 

pipe.communicate(data) 

एक मनमाना cwd के लिए, और जहां data कि यूनिकोड (विशेष रूप से 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) 

यह क्या हो रहा है, मुझे लगता है, क्योंकि pipe.communicate() उम्मीद है ASCII एन्कोडेड स्ट्रिंग, लेकिन data यूनिकोड है।

क्या यह समस्या मुझे सामना कर रही है, और मैं यूनिकोड को pipe.communicate() पर पास करने का एक तरीका रखता हूं?

पढ़ने के लिए धन्यवाद!

ब्रायन

+0

"यूनिकोड" में आपका क्या मतलब है? विशेष रूप से, 0xE9, स्वयं द्वारा, किसी भी सामान्य एन्कोडिंग में मान्य यूनिकोड कोड बिंदु नहीं है। – tripleee

उत्तर

14

मैं बदलकर इस समाधान कर लिया है हो सकता है:

pipe.communicate(data) 

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

हालांकि मैं सही करने की खड़े!

ब्रायन

+2

यह सही है। पाइप्स (और फाइलें, सॉकेट इत्यादि) बाइट्स ट्रांसमिट करते हैं, यूनिकोड नहीं (जो "अक्षर" है)। आपको इसे प्रसारित करने के लिए यूनिकोड एन्कोड करना होगा। –

+0

धन्यवाद! इसने एक समस्या तय की जो मैं Django के साथ कर रहा था - मेरे रूपों में से एक को उपप्रोसेसर के माध्यम से बाहरी प्रोसेसर में भेज दिया गया है, और यूनिकोड सबमिशन तब तक विफल रहा जब तक यह बदल नहीं गया। – maroonmed