2010-06-14 35 views
11

Tôi đang gọi pipe.communicate từ mô-đun subprocess của Python từ Python 2.6. Tôi nhận được lỗi sau đây từ mã này:Mã hóa Python cho pipe.communicate

from subprocess import Popen 

pipe = Popen(cwd) 

pipe.communicate(data) 

Đối với một tùy cwd, và nơi data chứa unicode (đặc biệt là 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) 

này đang xảy ra, tôi đoán, vì pipe.communicate() là mong đợi Chuỗi được mã hóa ASCII, nhưng data là unicode.

Đây có phải là sự cố mà tôi đang gặp phải không và tôi có cách để chuyển mã unicode thành pipe.communicate() không?

Cảm ơn bạn đã đọc!

Brian

+0

Ý bạn là gì khi "chứa Unicode"? Cụ thể, 0xE9 không phải là một điểm mã Unicode hợp lệ trong bất kỳ mã hóa thông thường nào. – tripleee

Trả lời

14

tôi thể đã giải quyết điều này bằng cách thay đổi:

pipe.communicate(data) 

để

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

Mặc dù tôi đứng để được sửa chữa!

Brian

+2

Đúng vậy. Đường ống (và các tệp, ổ cắm, vv) truyền byte, không phải Unicode (là "ký tự"). Bạn phải mã hóa Unicode để truyền nó. –

+0

Cảm ơn! Điều này cố định một vấn đề tôi đã có với Django - một trong các hình thức của tôi được chuyển đến một bộ xử lý bên ngoài thông qua subprocess, và Unicode đệ trình không cho đến khi điều này đã được thay đổi. – maroonmed