Question

Je rédigeais un setup.py pour un paquet Python en utilisant setuptools et je voulais inclure un caractère non-ASCII dans le champ 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
      ...)

Malheureusement, le passage d'un objet unicode de configuration () rompt l'une des deux commandes suivantes 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 version généralement logiciel en cours d'exécution « python setup.py sdist registre upload », ce qui signifie hacks laids qui ont l'air en sys.argv et passent le type d'objet droit sont dès la sortie.

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?

Était-ce utile?

La solution

Il est apparemment un bug distutils qui a été corrigé dans Python 2.6: http://mail.python.org/pipermail/distutils-sig/2009-September/013275.html

Tarek suggère correctif post_to_server. Le patch devrait pré-traiter toutes les valeurs du argument « données » et les transformer en unicode puis appeler la méthode originale. Voir http://mail.python.org/pipermail/distutils -sig / 2009-Septembre / 013277.html

Autres conseils

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

Je teste avec le code ci-dessus - il n'y a pas d'erreur de --long-description, seulement de rst2html; téléchargement semble fonctionner OK (même si j'Uploading en fait) et le registre me demande mon nom d'utilisateur que je n'ai pas. Mais le retraçage dans votre commentaire est utile -. C'est la conversion automatique en unicode dans la commande register qui cause le problème

Voir illusive setdefaultencoding pour plus d'informations sur ce point -, fondamentalement, vous voulez la valeur par défaut le codage en Python pour pouvoir convertir votre chaîne encodée retour à unicode, mais il est difficile de mettre en place. Dans ce cas, je pense qu'il vaut la peine:

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

Ou même être correct, vous pouvez l'obtenir à partir du locale - il y a code commenté dans /usr/lib/python2.6/site.py que vous pouvez constater que cela, mais je ne fait vais laisser cette discussion pour l'instant

.

Vous devez changer votre unicode description longue u"bläh bläh bläh" à une "bläh bläh bläh" chaîne normale et ajouter un en-tête de codage de la deuxième ligne de votre fichier:

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

Évidemment, vous devez enregistrer le fichier avec encodage UTF-8, aussi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top