TypeError:writelines()参数必须是一个字符串序列

时间:2010-07-30 20:44:56

标签: python exception-handling

尝试将异常重定向到STDERR时,我遇到了一个奇怪的错误。

我有一个脚本用于加载几个“插件”,作为主要入口程序。这些插件可以用来连接数据库,解析文本数据,连接到Web服务等......

是这样的:

   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

我不知道在这个地球上,Exception是不是在这里作为字符串返回。

4 个答案:

答案 0 :(得分:6)

我的解决方案是用UTF-8编码文本

file.writelines("some unicode text here".encode('utf-8'))

答案 1 :(得分:2)

我终于搞清楚了。

这发生在:

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)))

答案 2 :(得分:0)

e极有可能出错。我不知道为什么。可能某些事情没有得到适当的强制。

这有帮助吗?

sys.stderr.write(u'%s\n\n' % e)

答案 3 :(得分:0)

为了更好地了解正在发生的事情,请在try中包含有问题的声明:except:...在except子句中,执行

print repr(e), repr(unicode(e))

为什么您需要unicode个字符串而不是str字符串?