Python print在不同服务器上的工作方式不同

2024-05-29 03:41:59 发布

您现在位置:Python中文网/ 问答频道 /正文

当我试图在开发服务器上打印unicode字符串时,它可以正常工作,但生产服务器会引发异常。在

File "/home/user/twistedapp/server.py", line 97, in stringReceived
    print "sent:" + json
File "/usr/lib/python2.6/dist-packages/twisted/python/log.py", line 555, in write
    d = (self.buf + data).split('\n')
exceptions.UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 28: ordinal not in range(128)

实际上,它是twisted应用程序,并打印到日志文件。在

字符串的repr()是相同的。区域设置为en_美国UTF-8。在

我需要检查哪些配置才能使它在两个服务器上工作相同吗?在


Tags: 字符串inpy服务器homeserverlineunicode
2条回答

Unicode字符串的print依赖于sys.stdout(进程的标准输出)具有正确的.encoding属性,Python可以使用该属性将Unicode字符串编码为字节字符串以执行所需的打印,并且该设置取决于操作系统的设置方式,标准输出指向何处,等等。在

如果没有这样的属性,则使用默认编码的ascii,并且,正如您所看到的,它通常不能提供所需的结果;-)。在

你可以检查getattr(sys.stdout, 'encoding', None)看看编码是否在那里(如果是,你可以祈祷它是正确的。。。或者,可以尝试一些特定于平台的技巧来猜测要检查的正确系统编码;-)。如果不是,一般来说,没有可靠的或跨平台的方法来猜测它可能是什么。你可以试试'utf8',这是一种在很多情况下都能工作的通用编码(肯定比ascii做的还要多;-),但这确实是一个轮盘赌的旋转。在

为了提高可靠性,您的程序应该有自己的配置文件来告诉它要使用什么输出编码(如果没有另外指定的话,可以使用'utf8'作为默认值)。在

为了更好地进行编码

print someunicode

而是

^{pr2}$

实际上,如果你宁愿有不完整的输出而不是崩溃

print someunicode.encode(thecodec, 'ignore')

(它只是跳过不可编码字符),或者,通常更好

print someunicode.encode(thecodec, 'replace')

(对不可编码字符使用问号占位符)。在

Twisted的内置日志观察程序不支持Unicode。请参阅http://twistedmatrix.com/trac/ticket/989以获取添加对此的支持的进度,或者查看您可以做些什么来帮助您。在

除非#989得到了解决,并且应用程序部署在Twisted版本中,否则不要记录unicode。只记录str。在

相关问题 更多 >

    热门问题