Трубный вывод скрипта python

Я запускаю ./sample.py --url http://blah.com без ошибок, хотя, если я запускаю ./sample.py --url http://blah.com | wc -l или подобное, я получаю сообщение об ошибке:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u200f' in position 0: ordinal not in range(128)

Как сделать скрипт Python совместимым с моими командами терминала? Я продолжаю видеть ссылку на sys.stdin.isatty, хотя его вариант использования кажется противоположным.


person mbb    schedule 20.11.2012    source источник
comment
Как выглядит sample.py? Вы просто делаете обычные операторы print?   -  person Brendan Long    schedule 21.11.2012
comment
Вы можете попробовать использовать xargs: ./sample.py --url http://blah.com | xargs wc -l   -  person David    schedule 21.11.2012


Ответы (2)


Когда Python обнаруживает, что он печатает на терминал, sys.stdout.encoding устанавливается на кодировку терминала. Когда вы print unicode, unicode кодируется в str с помощью sys.stdout.encoding.

Когда Python не обнаруживает, что он печатает на терминал, sys.stdout.encoding устанавливается на None. Когда вы print используете unicode, используется кодек ascii (по крайней мере, в Python2). Это приведет к ошибке UnicodeError, если unicode содержит кодовые точки за пределами 0-127.

Один из способов исправить это — явно закодировать unicode перед печатью. Возможно, это правильный способ, но он может быть трудоемким, если у вас разбросано много операторов печати.

Другой способ исправить это — установить для переменной среды PYTHONIOENCODING значение соответствующую кодировку. Например,

PYTHONIOENCODING=utf-8

Тогда эта кодировка будет использоваться вместо ascii при печати вывода в файл.

Дополнительную информацию см. на вики-странице PrintFails.

person unutbu    schedule 20.11.2012
comment
Спасибо за это @unutbu. Мысль № 1 — следуйте этой статье с этого момента . # 2 - Где сейчас правильно разместить эту строку? - person mbb; 21.11.2012
comment
@mjb: то, как вы должны установить переменную среды PYTHONIOENCODING, зависит от ОС машины. Это делается так же, как вы устанавливаете переменную окружения PYTHONPATH. В Linux вы можете поместить export PYTHONIOENCODING=utf-8 в файл ~/.profile или ~/.bashrc. - person unutbu; 21.11.2012
comment
@mjb: для одной команды в bash: PYTHONIOENCODING=utf-8 ./sample.py .... Кстати, воспринимаемые пользователем символы и кодовые точки - разные вещи, хотя это тема для другой статьи. - person jfs; 21.11.2012

Пытаться:

(./sample.py --url http://blah.com) | wc -l

Это порождает подоболочку для запуска вашего скрипта Python, а затем передает вывод из stdout в wc

person sampson-chen    schedule 20.11.2012
comment
Не получится, попробуй ( python -c 'print(u"tra\u00eetre")' ) | wc -l - person jfs; 21.11.2012
comment
py может быть выполнен только интерпретатором python в начале sample.py - person Fahad Naeem; 15.12.2017