为避免UnicodeDecodeError,Python需要哪些依赖?
我正在使用Plone集体的Python构建工具。这个工具可以构建不同版本的Python,包括2.6和2.7。
但是,当我尝试用2.7版本发布时,出现了这个错误:
$ /Users/aclark/Developer/collective/python/python-2.7/bin/mkrelease -T -d local
…
adding 'plonetheme.grungeera-0.1.1/plonetheme.grungeera.egg-info/dependency_links.txt'
adding 'plonetheme.grungeera-0.1.1/plonetheme.grungeera.egg-info/entry_points.txt'
adding 'plonetheme.grungeera-0.1.1/plonetheme.grungeera.egg-info/namespace_packages.txt'
adding 'plonetheme.grungeera-0.1.1/plonetheme.grungeera.egg-info/not-zip-safe'
adding 'plonetheme.grungeera-0.1.1/plonetheme.grungeera.egg-info/PKG-INFO'
adding 'plonetheme.grungeera-0.1.1/plonetheme.grungeera.egg-info/requires.txt'
adding 'plonetheme.grungeera-0.1.1/plonetheme.grungeera.egg-info/SOURCES.txt'
adding 'plonetheme.grungeera-0.1.1/plonetheme.grungeera.egg-info/top_level.txt'
removing 'plonetheme.grungeera-0.1.1' (and everything under it)
running register
running check
Traceback (most recent call last):
File "<string>", line 22, in <module>
File "setup.py", line 36, in <module>
""",
File "/Users/aclark/Developer/collective/python/parts/opt/lib/python2.7/distutils/core.py", line 152, in setup
dist.run_commands()
File "/Users/aclark/Developer/collective/python/parts/opt/lib/python2.7/distutils/dist.py", line 953, in run_commands
self.run_command(cmd)
File "/Users/aclark/Developer/collective/python/parts/opt/lib/python2.7/distutils/dist.py", line 972, in run_command
cmd_obj.run()
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/distribute-0.6.15-py2.7.egg/setuptools/command/register.py", line 9, in run
_register.run(self)
File "/Users/aclark/Developer/collective/python/parts/opt/lib/python2.7/distutils/command/register.py", line 51, in run
self.run_command(cmd_name)
File "/Users/aclark/Developer/collective/python/parts/opt/lib/python2.7/distutils/cmd.py", line 326, in run_command
self.distribution.run_command(command)
File "/Users/aclark/Developer/collective/python/parts/opt/lib/python2.7/distutils/dist.py", line 972, in run_command
cmd_obj.run()
File "/Users/aclark/Developer/collective/python/parts/opt/lib/python2.7/distutils/command/check.py", line 69, in run
self.check_restructuredtext()
File "/Users/aclark/Developer/collective/python/parts/opt/lib/python2.7/distutils/command/check.py", line 111, in check_restructuredtext
for warning in self._check_rst_data(data):
File "/Users/aclark/Developer/collective/python/parts/opt/lib/python2.7/distutils/command/check.py", line 138, in _check_rst_data
parser.parse(data, document)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/parsers/rst/__init__.py", line 157, in parse
self.statemachine.run(inputlines, document, inliner=self.inliner)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/parsers/rst/states.py", line 170, in run
input_source=document['source'])
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/statemachine.py", line 233, in run
context, state, transitions)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/statemachine.py", line 454, in check_line
return method(match, context, next_state)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/parsers/rst/states.py", line 2706, in underline
self.section(title, source, style, lineno - 1, messages)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/parsers/rst/states.py", line 329, in section
self.new_subsection(title, lineno, messages)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/parsers/rst/states.py", line 398, in new_subsection
node=section_node, match_titles=1)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/parsers/rst/states.py", line 284, in nested_parse
node=node, match_titles=match_titles)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/parsers/rst/states.py", line 195, in run
results = StateMachineWS.run(self, input_lines, input_offset)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/statemachine.py", line 233, in run
context, state, transitions)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/statemachine.py", line 454, in check_line
return method(match, context, next_state)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/parsers/rst/states.py", line 2706, in underline
self.section(title, source, style, lineno - 1, messages)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/parsers/rst/states.py", line 329, in section
self.new_subsection(title, lineno, messages)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/parsers/rst/states.py", line 398, in new_subsection
node=section_node, match_titles=1)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/parsers/rst/states.py", line 284, in nested_parse
node=node, match_titles=match_titles)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/parsers/rst/states.py", line 195, in run
results = StateMachineWS.run(self, input_lines, input_offset)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/statemachine.py", line 233, in run
context, state, transitions)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/statemachine.py", line 454, in check_line
return method(match, context, next_state)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/parsers/rst/states.py", line 2706, in underline
self.section(title, source, style, lineno - 1, messages)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/parsers/rst/states.py", line 329, in section
self.new_subsection(title, lineno, messages)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/parsers/rst/states.py", line 398, in new_subsection
node=section_node, match_titles=1)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/parsers/rst/states.py", line 284, in nested_parse
node=node, match_titles=match_titles)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/parsers/rst/states.py", line 195, in run
results = StateMachineWS.run(self, input_lines, input_offset)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/statemachine.py", line 233, in run
context, state, transitions)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/statemachine.py", line 454, in check_line
return method(match, context, next_state)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/parsers/rst/states.py", line 2646, in blank
self.parent += self.literal_block()
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/parsers/rst/states.py", line 2740, in literal_block
literal_block = nodes.literal_block(data, data)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/nodes.py", line 807, in __init__
TextElement.__init__(self, rawsource, text, *children, **attributes)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/nodes.py", line 795, in __init__
textnode = Text(text)
File "/Users/aclark/Developer/collective/python/python-2.7/lib/python2.7/site-packages/docutils/nodes.py", line 331, in __new__
return reprunicode.__new__(cls, data)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 32: ordinal not in range(128)
register failed
不过如果我使用Python 2.6的话:
$ /Users/aclark/Developer/collective/python/python-2.6/bin/mkrelease -T -d local
就没有UnicodeDecodeError的错误,一切都正常运行。
通常情况下,这让我觉得可能是Python编译时的环境出了问题(我用的是Mac OS X),但在这个例子中,2.6和2.7都是在同样的环境下编译的,结果一个能用,一个不能用。
那这里可能出什么问题了呢?我可以检查些什么来找出原因呢?
2 个回答
0
这个问题发生是因为Python从一个不是ASCII编码的文件中读取了一些数据。Python默认使用的编码是ascii
,而ASCII只支持7位字符(也就是小于128的字符)。
你有几个方法可以解决这个问题:
- 告诉Python使用这个文件的正确编码
- 以二进制方式读取文件,直接处理字节而不是字符串(这种方法不太常用)
- 把Python的默认编码改成utf-8(这有点风险)
顺便说一下,我尝试在我的系统上运行bin/buildout,但它失败了(后面会提到),因为它使用了一些编译器不支持的命令行选项。
gcc -c -fno-strict-aliasing -Wno-long-double -no-cpp-precomp -mno-fused-madd -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -I. -I./Include -DPy_BUILD_CORE -o Modules/python.o Modules/python.c
cc1: error: unrecognized command line option "-Wno-long-double"
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)
1
我觉得不同的地方在于两个Python安装中的docutils版本。
docutils这个包还在不断更新,开发团队会定期发布当前的版本快照。你在Python 2.7的错误信息中看到的行号似乎和最新的快照相符(根据下载页面的头部信息,这个快照是在2010年9月1日发布的)。
我比较确定,Python 2.6的site-packages目录和你Python 2.7的安装目录是不同的。
你可以运行:
diff -ur python-2.6/lib/python2.6/site-packages/docutils python-2.7/lib/python2.7/site-packages/docutils
来确认这一点。如果我说的没错,只需把2.6版本的文件复制到2.7的目录里,然后让Python 2.7在导入时重新编译这些文件,或者使用这个compileall.py
脚本:
python-2.7/bin/python python-2.7/lib/python2.7/compileall.py lib/python2.7/site-packages/docutils