как обычно вопрос не в SciTe или XXX (подставить любой редактор или инструмент), а в том, что 99,99999% питон-программистов не понимают, что печатать unicode строки в общем случае НЕЛЬЗЯ!!! Возьмите ручку и напишите 1000 раз на листике бумаги: Я НИКОГДА НЕ БУДУ ПЕЧАТАТЬ UNICODE-СТРОКИ
Когда вы работаете интерактивно, то ваш sys.stdout подключен к реальному терминальному окну. К РЕАЛЬНОМУ. Которе имеет конечно какую-то дефолтную кодировку выводимых символов. Питон при старте интерпретатора ловит наличие реального терминала, определяет какая кодировка там используется и создает специальную ОБВЕРТКУ вокруг потока STDOUT, которая обеспечивает перекодирование unicode-символов. Именно с этой обверткой мы имеем дело, когда говорим sys.stdout.
Когда же питон-скрипт вызывается как субпроцесс (сюрпрайз-сюрпрайз! именно так запускают скрипты почти все редакторы, чтобы перехватить вывод интерпретатор и показать его красиво в своем специальном окне), ИЛИ же вывод скрипта перенаправляется в файл или через pipe в программу типа less или more:
python script.py > file.log
python script.py | more
то у нас нет реального терминала. Есть просто поток вывода. Файловый поток. Который ничего не знает о кодировках.
В этом случае при старте питон интерпретатора для потока sys.stdout никакой перекодирующей обвертки не создается! И вот тут-то все не-ascii программисты и пользователи ловят UnicodeDecodeError. И начинается: о ужас! что же делать??? SciTe глючит! XXX глюкало! на помойку!
Товарищи! Выкиньте на помойку свои примитивные программы или по крайней мере забудьте о том, что символы с кодом больше 127 вообще существуют.
Кто виноват мы вроде разобрались.
Теперь: что делать.
А делать надо вот что.
Самый правильный и занудный вариант: никогда не печатать юникодные строки, а перекодировать их ручками в нужную кодировку: print unistr.encode('cp1251')
Только руки устанут кодировать такое.
Другой правильный путь (он более сложный, но не занудный):
1) проверить что sys.stdout подключен к реальному терминалу: sys.stdout.isatty()
2) если не подключен, что делаем обвертку руками:
import codecs
outf = codecs.getwriter('cp1251')(sys.stdout)
и использовать поток outf для вывода ваших замечательных юникодных строк.
Можно даже подменить sys.stdout этой обверткой.
И помните, что до создания обвертки никакие юникодные символы вы печатать не можете! вапще.
3) Вместо cp1251 надо бы подставлять кодировку пользователя, иначе ваша прога будет работать только для русской винды. И в терминале вобщето надо юзать cp866, если вы не используете команду chcp конечно. Для того, чтобы определить кодировку терминала надо немного больше усилий. Мне щас лень копи-пастить код, но в исходниках проекта Базаар это реализовано как надо в лучшем кросс-платформенном виде.
Да и еще. Обвертку outf имеет создавать дя вывода всегда, даже когда у вас присутствует реальный терминал. А то захотите вы нечаянно напечатать какой-нить китайский иероглиф в русской консоли – и опять поймаете UnicodeEncodeError. Только при создании обвертки надо юзать необязательный аргумент errors:
outf = codecs.getwriter('cp1251')(sys.stdout, errors='replace')
и все непечатные символы будут подменены вопросиками. Другое дело, что вам может быть не всегда это нужно. Дальше думайте своей головой, пожалуйста.