2013-04-01 30 views
10

Tôi đang sử dụng một kịch bản python đơn giản để có được kết quả đặt phòng cho CID của tôi: simple.py:Python: UnicodeEncodeError khi tôi sử dụng grep

data = {"minorRev":"current minorRev #","cid":"xxx","apiKey":"xxx","customerIpAddress":" ","creationDateStart":"03/31/2013","} 

url = 'http://someservice/services/rs/'      
req = requests.get(url,params=data)       
print req                 
print req.text                 
print req.status_code 

Bây giờ trên cửa sổ lệnh nếu tôi làm python simple.py nó chạy một cách hoàn hảo và in các req.text biến

Tuy nhiên khi tôi cố gắng làm
python simple.py | grep pattern

tôi nhận được
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 1314: ordinal not in range(128)

+0

Xem: http://stackoverflow.com/questions/2596714/why-does-python-print-unicode-characters -when-the-default-encoding-is-ascii –

+1

đọc qua [this] (http://stackoverflow.com/questions/1473577/writing-unicode-strings-via-sys-stdout-in-python). Về cơ bản, khi đường ống đầu ra, 'sys.stdout.encoding == None' – shx2

Trả lời

18

printnhu cầu để mã hóa chuỗi trước khi gửi đến stdout nhưng khi quá trình này trong một đường ống, giá trị của sys.stdout.encodingNone, vì vậy print nhận một đối tượng unicode và sau đó nó cố gắng mã hóa đối tượng này bằng cách sử dụng codec ascii - nếu bạn có các ký tự không phải ASCII trong đối tượng unicode này, một ngoại lệ sẽ được nâng lên.

Bạn có thể giải quyết sự cố này mã hóa tất cả các đối tượng unicodetrước khi gửi đến đầu ra tiêu chuẩn (nhưng bạn cần phải đoán codec nào sẽ sử dụng). Xem các ví dụ:

file wrong.py:

# coding: utf-8 

print u'Álvaro' 

Kết quả:

[email protected]:/tmp 
$ python wrong.py 
Álvaro 
[email protected]:/tmp 
$ python wrong.py | grep a 
Traceback (most recent call last): 
    File "wrong.py", line 3, in <module> 
    print u'Álvaro' 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xc1' in position 0: ordinal not in range(128) 

file right.py:

# coding: utf-8 

print u'Álvaro'.encode('utf-8') 
# unicode object encoded == `str` in Python 2 

Kết quả:

[email protected]:/tmp 
$ python right.py 
Álvaro 
[email protected]:/tmp 
$ python right.py | grep a 
Álvaro 
3

Nếu sys.stdout.isatty() là sai (đầu ra được chuyển hướng đến tệp/đường ống), sau đó định cấu hình PYTHONIOENCODING envvar bên ngoài tập lệnh của bạn. Luôn in Unicode, không hardcode mã hóa ký tự của môi trường của bạn bên trong kịch bản của bạn:

$ PYTHONIOENCODING=utf-8 python simple.py | grep pattern 
Các vấn đề liên quan