什么是正确的方式使用Unicode元数据setup.py?
-
18-09-2019 - |
题
我正在写一个setup.py 为Python包使用的设置工具,并希望包括非ASCII character在long_description领域:
#!/usr/bin/env python
from setuptools import setup
setup(...
long_description=u"...", # in real code this value is read from a text file
...)
不幸的是,通过一个unicode对象setup()打破以下两种命令有UnicodeEncodeError
python setup.py --long-description | rst2html python setup.py upload
如果我使用一个原UTF-8串的long_description场,那么以下命令,打破了一个UnicodeDecodeError:
python setup.py register
我一般发行的软件通过运行'蟒蛇setup.py sdist登记册上传',这意味着丑陋的黑客看到sys.argv,并通过合适的对象类型是正确的。
在结束我放弃了和实施了一个不同的丑陋的黑:
class UltraMagicString(object):
# Catch-22:
# - if I return Unicode, python setup.py --long-description as well
# as python setup.py upload fail with a UnicodeEncodeError
# - if I return UTF-8 string, python setup.py sdist register
# fails with an UnicodeDecodeError
def __init__(self, value):
self.value = value
def __str__(self):
return self.value
def __unicode__(self):
return self.value.decode('UTF-8')
def __add__(self, other):
return UltraMagicString(self.value + str(other))
def split(self, *args, **kw):
return self.value.split(*args, **kw)
...
setup(...
long_description=UltraMagicString("..."),
...)
是不是有一个更好的办法?
解决方案
这显然是一个distutils来完成的错误已被固定在python2.6: http://mail.python.org/pipermail/distutils-sig/2009-September/013275.html
Tarek建议修补post_to_server.修补该预过程中的所有值 "数据"的论点,并把它们变成unicode然后调用原始的方法。看看 http://mail.python.org/pipermail/distutils-sig/2009-September/013277.html
其他提示
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from setuptools import setup
setup(name="fudz",
description="fudzily",
version="0.1",
long_description=u"bläh bläh".encode("UTF-8"), # in real code this value is read from a text file
py_modules=["fudz"],
author="David Fraser",
author_email="davidf@sjsoft.com",
url="http://en.wikipedia.org/wiki/Fudz",
)
我与上面的代码测试 - 没有来自--long-描述错误,仅从rst2html;上传似乎工作正常(虽然我实际上取消上传)和寄存器找我要我的用户名,我没有。但是,在您的评论的追踪是有帮助的 - 它的自动转换中引起该问题的unicode
命令register
请参阅虚幻setdefaultencoding 的详细信息,这一点 - 基本上你想要的默认在Python编码能够将您的编码字符串转换回为Unicode,但它是棘手此设置。在这种情况下,我认为这是值得的:
import sys
reload(sys).setdefaultencoding("UTF-8")
甚至是正确的,你可以从locale
得到它 - 有代码/usr/lib/python2.6/site.py
注释掉,你可以找到做这个,但我会离开这个讨论现在
您需要将长的unicode描述u"bläh bläh bläh"
改变到正常的字符串"bläh bläh bläh"
并添加编码头作为文件的第二行:
#!/usr/bin/env python
# encoding: utf-8
...
...
显然,你需要使用UTF-8编码的文件了。