Ответ 1
print
требуется для кодирования строки перед отправкой на stdout, но когда процесс находится в канале, значение sys.stdout.encoding
равно None
, поэтому print
получает unicode
, а затем он пытается кодировать этот объект с помощью кодека ascii
- если в этом объекте unicode
есть символы, отличные от ASCII, будет создано исключение.
Вы можете решить эту проблему, кодируя все объекты unicode
, прежде чем отправлять ее на стандартный вывод (но вам нужно угадать, какой кодек использовать). См. Следующие примеры:
Файл wrong.py
:
# coding: utf-8
print u'Álvaro'
Результат:
[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)
Файл right.py
:
# coding: utf-8
print u'Álvaro'.encode('utf-8')
# unicode object encoded == `str` in Python 2
Результат:
[email protected]:/tmp
$ python right.py
Álvaro
[email protected]:/tmp
$ python right.py | grep a
Álvaro