我在寫一個setup.py使用setuptools的Python包,並希望包括在LONG_DESCRIPTION領域的非ASCII字符:在setup.py中使用Unicode元數據的正確方法是什麼?
#!/usr/bin/env python
from setuptools import setup
setup(...
long_description=u"...", # in real code this value is read from a text file
...)
不幸的是,經過一個Unicode對象設置()或者突破的以下兩個命令與UnicodeEncodeError
python setup.py --long-description | rst2html python setup.py upload
如果我使用原始UTF-8字符串爲LONG_DESCRIPTION字段,那麼下面的命令中斷以UnicodeDecodeError:
python setup.py register
我通常通過運行'python setup.py sdist register upload'來發布軟件,這意味着查看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("..."),
...)
是不是有更好的辦法?
我不知道我可以將完整的追溯信息粘貼到此處的評論中;回溯結束於/usr/lib/python2.6/distutils/command/register.py第264行(在post_to_server中),它嘗試執行此操作:value = unicode(value).encode(「utf-8」)。正如你所看到的,我使用Python 2.6;一個更高版本的distutils將不得不是真正的流血事件。 – 2009-07-27 18:12:37
您會注意到,複製要求您在該字段中至少有一個非ASCII字符。 – 2009-07-27 18:14:06
我可以重現'python設置。py註冊'錯誤與我在這裏的所有三個版本的Python:2.4,2.5和2.6。 – 2009-07-27 18:15:28