>>> print 'абвгд'
абвгд
Когда вы вводите некоторые символы, ваш терминал решает, как эти символы представляются в приложении. Ваш терминал может выдавать символы приложению в кодировке utf-8, ISO-8859-5 или даже что-то, что понимает только ваш терминал. Python получает эти символы в виде некоторой последовательности байтов. Затем python распечатывает эти байты такими, какие они есть, и ваш терминал каким-то образом интерпретирует их для отображения символов. Поскольку ваш терминал обычно интерпретирует байты так же, как он их кодировал ранее, все отображается так, как вы его набрали.
>>> u'абвгд'
Здесь вы вводите некоторые символы, которые поступают в интерпретатор python в виде последовательности байтов, которые, возможно, каким-то образом кодируются терминалом. С префиксом u
python пытается преобразовать эти данные в юникод. Чтобы сделать это правильно, python должен знать, какую кодировку использует ваш терминал. В вашем случае, похоже, Python предполагает, что кодировка вашего терминала будет ASCII, но полученные данные не соответствуют этому, поэтому вы получаете ошибку кодирования.
Прямой способ создания Unicode-строк в интерактивном сеансе будет выглядеть примерно так:
>>> us = 'абвгд'.decode('my-terminal-encoding')
В файлах вы также можете указать кодировку файла с помощью специальной строки режима:
# -*- encoding: ISO-8859-5 -*-
us = u'абвгд'
Для других способов установки входной кодировки по умолчанию вы можете посмотреть sys.setdefaultencoding(...)
или sys.stdin.encoding
.