je rédigeais un setup.py pour un paquet Python en utilisant setuptools et voulaient inclure un caractère non-ASCII dans le champ long_description:Quelle est la bonne façon d'utiliser les métadonnées Unicode dans setup.py?
#!/usr/bin/env python
from setuptools import setup
setup(...
long_description=u"...", # in real code this value is read from a text file
...)
Malheureusement, le passage d'un objet unicode à la configuration() brise l'une des après deux commandes avec un UnicodeEncodeError
python setup.py --long-description | rst2html python setup.py upload
Si j'utilise une chaîne UTF-8 premières pour le champ long_description, puis les pauses de commande suivantes avec un UnicodeDecodeError:
python setup.py register
Je publie généralement un logiciel en exécutant 'python setup.py sdist register upload', ce qui signifie que les hacks vilains qui regardent sys.argv et passent le bon type d'objet sont à droite.
En fin de compte, j'ai abandonné et mis en œuvre un autre bidouille horrible:
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("..."),
...)
N'y at-il une meilleure façon?
Je ne suis pas sûr de pouvoir coller la trace complète dans un commentaire ici; la traceback se termine dans /usr/lib/python2.6/distutils/command/register.py ligne 264 (dans post_to_server) où il essaie de le faire: value = unicode (value) .encode ("utf-8"). Comme vous pouvez le voir, j'utilise Python 2.6; une version plus récente de distutils devrait être vraiment saignante. –
Vous remarquerez que la reproduction nécessite que vous ayez au moins un caractère non-ASCII dans le champ. –
Je peux reproduire la configuration 'python.py register 'erreur avec les trois versions de Python que j'ai ici: 2.4, 2.5 et 2.6. –