Pregunta

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:

#!/usr/bin/env python
from setuptools import setup
setup(...
      long_description=u"...", # in real code this value is read from a text file
      ...)

Por desgracia, pasando un objeto Unicode de configuración () rompe cualquiera de los dos comandos siguientes 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

Yo por lo general versión de software ejecutando 'setup.py pitón sdist registro de carga', lo que significa que se ven feos cortes en sys.argv y pasan el tipo de objeto derecha están a la derecha.

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?

¿Fue útil?

Solución

Al parecer es un error distutils que se ha fijado en Python 2.6: http://mail.python.org/pipermail/distutils-sig/2009-September/013275.html

Tarek sugiere a post_to_server parche. El parche debe pre-proceso de todos los valores en el argumento "datos" y convertirlos en Unicode y luego llamar al método original. Ver http://mail.python.org/pipermail/distutils -sig / 2009-septiembre / 013277.html

Otros consejos

#!/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",
      )

Estoy probando con el código anterior - no hay error de --long-descripción, sólo a partir rst2html; Subir parece funcionar bien (aunque en realidad la posibilidad de subir cancelo) y el registro me pide mi nombre de usuario, que no tengo. Sin embargo, el rastreo, en su comentario es útil -. Que es la conversión automática a unicode en el comando register que causa el problema

la setdefaultencoding ilusoria para obtener más información sobre este - básicamente desea que el valor predeterminado codificación en Python para ser capaz de convertir su cadena codificada de nuevo a unicode, pero es difícil de configurar esto. En este caso creo que vale la pena el esfuerzo:

import sys
reload(sys).setdefaultencoding("UTF-8")

O incluso ser correcta se puede obtener de la locale - no hay código comentado en /usr/lib/python2.6/site.py que se puede encontrar que hace esto, pero voy a dejar que la discusión por ahora

.

Es necesario cambiar el Unicode descripción larga u"bläh bläh bläh" a un "bläh bläh bläh" cadena normal y añadir una cabecera de codificación que la segunda línea del archivo:

#!/usr/bin/env python
# encoding: utf-8
...
...

Obviamente, es necesario guardar el archivo con codificación UTF-8, también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top