Python Unicode错误,同步开发环境和生产

时间:2014-03-27 22:18:28

标签: python development-environment production-environment python-unicode

我刚刚运行了一个正在运行的应用程序的一些unicode错误,它不时地处理非常奇怪的字符串,最近,

Pınar Karsıyaka

在我的开发环境中(Aptana w.PyDev on Mavericks Mac上有一个最新的自制软件安装),处理这个字符串不会产生错误,并作为

打印到控制台
P\u0131nar Kars\u0131yaka v Torku Selcuk

但在生产环境中,标准的Ubuntu和Python安装在Amazon EC2小盒子上,打印方式如

P\xc4\xb1nar Kars\xc4\xb1yaka v Torku Selcuk

并给出了一个可怕的Python错误,

UnicodeEncodeError: 'ascii' codec can't encode character u'\u0131' in position 50: ordinal not in range(128)

我想知道如何(如果可能的话)使prod环境能够处理这些字符,比如我的开发环境可以,但也希望能够改变我的开发环境来破坏像prod一,所以我可以处理在代码中发生这种情况的事件。

感谢您提供任何帮助。

Mac Python -  Python 2.7.5(默认,2013年11月1日,18:38:34)  [达尔文的GCC 4.2.1兼容的Apple LLVM 5.0(clang-500.2.79)]

Ubuntu Python -  Python 2.7.3(默认,2013年4月10日,06:20:15)  linux2上的[GCC 4.6.3]

2 个答案:

答案 0 :(得分:3)

如果你在python源码的2.7分支中稍微潜水,你会发现default encoding of unicode strings首先是set to some forced value(现在,它是“ascii”,尽管它已经是“utf” -8“之前),但在解释器的每个实例化期间都是overridden by the site module

要检查每个平台上的行为,请运行:

$ python -c 'import sys; print(sys.getdefaultencoding())'

现在,如果你想让它们均匀,那就不是很简单,因为这个功能 'setdefaultencoding'是deleted in the site module,所以你必须这样做 重新加载sys模块以获取它:

$ python -c 'import sys; reload(sys); sys.setdefaultencoding("utf-8"); print(sys.getdefaultencoding())'

这样,无论语言环境如何,您都可以在每个平台上使用相同的编码在解释器中 从os到python构建的多个级别定义的编码。

答案 1 :(得分:1)

图书馆版

请确认所有库版本都相同,我怀疑API更改会从某些外部数据源返回unicode vs str。升级SQLObjectCherrypy之前,我已经看到过这些问题。此外,数据源设置也很重要,例如,如果您使用mysql服务器,则需要注意default_encoding

您的问题没有指明数据来源,很难猜测。

至少,请在两个环节中进行pip freeze并比较版本号。

默认编码

检查其中一个环境中是否有sitecustomize.py - 这是设置任何不稳定事物的官方方式(无论如何你不应该这样做,但那是另一个故事)。

它可能与@ chocko01建议完全相同 - 设置了deafault编码。通过在两种环境中记录sys.getdefaultencoding()来检查它。

在Python中设置默认编码使转换unicode<->str(Python2)和str<->bytes(Python3)透明,但从长远来看,这是一个坏主意。请记住explicit is better than implicit

跟踪您的数据

它很难解决,但除非你能在可重复的测试中捕捉到这个特殊的问题,否则第二好的就是倾倒大量的原木,然后向后工作,看看你的时髦之处输入来自。

然后向下追踪它以确定本地和生产环境之间的差异。

出现错误时,它在您的本地环境中unicode和生成环境中的UTF-8编码,又名str。您有两个环境样本的事实表明您能够重现该问题。也许你应该写一个自动化测试。