estaba escribiendo un setup.py para un paquete Python usando setuptools y quería incluir un carácter no ASCII en el campo long_description:¿Cuál es la forma correcta de usar los metadatos Unicode en 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
...)
Desafortunadamente, pasando un objeto Unicode de configuración() rompe una de las tras dos comandos con un UnicodeEncodeError
python setup.py --long-description | rst2html python setup.py upload
Si utilizo una cadena de texto en UTF-8 para el campo long_description, a continuación, las siguientes mando rompe con una UnicodeDecodeError:
python setup.py register
Por lo general, lanzo software ejecutando 'python setup.py sdist register upload', lo que significa que los hacks feos que miran en sys.argv y pasan el tipo de objeto correcto están fuera.
Al final me di por vencido y puesto en marcha un feo corte diferente:
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("..."),
...)
no hay una manera mejor?
No estoy seguro de poder pegar la traza completa en un comentario aquí; el rastreo termina en /usr/lib/python2.6/distutils/command/register.py línea 264 (en post_to_server) donde intenta hacer esto: value = unicode (value) .encode ("utf-8"). Como pueden ver, estoy usando Python 2.6; una versión posterior de distutils tendría que ser algo realmente sangriento. –
Observará que la reproducción requiere que tenga al menos un carácter que no sea ASCII en el campo. –
Puedo reproducir la configuración de 'python'.Error de py register 'con las tres versiones de Python que tengo aquí: 2.4, 2.5 y 2.6. –