TypeError: аргумент writelines () должен быть последовательностью строк - PullRequest
2 голосов
/ 31 июля 2010

У меня странная ошибка при попытке перенаправить исключение в STDERR.

У меня есть скрипт, который используется для загрузки нескольких «плагинов», работающих в качестве основной программы входа.Плагины выполняют такие функции, как подключение к базам данных, анализ текстовых данных, подключение к веб-службам и т. Д. ...

Это выглядит так:

   try:
        Run plugins here...
        #All was ok!
        print "Ok!"
        sys.exit(0)
    except Exception,e:
        sys.stderr.writelines([unicode(e),u'\n',u'\n'])

        traceback.print_exc(file=sys.stderr)
        sys.exit(-1)

Это выполняется в командной строке,и иногда я получаю сообщение об ошибке:

TypeError: writelines() argument must be a sequence of strings

Я понятия не имею, как на этой земле Исключение не возвращается здесь в виде строки.

Ответы [ 4 ]

6 голосов
/ 28 мая 2015

Мое решение для этого было закодировать текст в UTF-8

file.writelines("some unicode text here".encode('utf-8'))
2 голосов
/ 28 сентября 2010

Я наконец понял это.

Это случилось, когда:

try:
   raise Exception(u'Error with unicode chars')
except:
  sys.stderr.write(u'%s\n\n' % e)

Я взломал это (из сообщества activestate):

def safe_unicode(obj, * args):
    """ return the unicode representation of obj """
    try:
        return unicode(obj, * args)
    except UnicodeDecodeError:
        # obj is byte string
        ascii_text = str(obj).encode('string_escape')
        return unicode(ascii_text)

def safe_str(obj):
    """ return the byte string representation of obj """
    try:
        return str(obj)
    except UnicodeEncodeError:
        # obj is unicode
        return unicode(obj).encode('unicode_escape')


 #code
 except Exception,e:
        sys.stderr.write(u'%s\n\n' % safe_unicode(safe_str(e)))
0 голосов
/ 31 июля 2010

Чтобы получить лучшее представление о том, что происходит, оберните оскорбительный оператор в try: exc:unicode строк вместо str строк?

0 голосов
/ 31 июля 2010

Весьма вероятно, что e виноват. Понятия не имею почему. Возможно, что-то не принуждается должным образом.

Помогает ли это?

sys.stderr.write(u'%s\n\n' % e)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...