我正在写一个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编码的文件了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top