10
votes

Quelle est la bonne façon d'utiliser des métadonnées unicode dans setup.py?

J'écris un ensemble setup.py pour un package Python à l'aide de SetUpoTools et souhaitais inclure un caractère non ASCII dans le champ long_description: xxx pré>

malheureusement, transmettre un objet Unicode à la configuration ( ) casse l'une des deux commandes suivantes avec un UnicodeenCodeError P> xxx pré>

si j'utilise une chaîne UTF-8 RAW pour le champ LONG_DESCRIPTION, la commande suivante se casse avec une UnicodeDecodeError:

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("..."),
      ...)


0 commentaires

3 Réponses :


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

5 commentaires

Je ne suis pas sûr que je puisse coller la toute trace dans un commentaire ici; La traçabilité se termine dans /usr/lib/python2.6/distutils/command/register.py ligne 264 (dans post_to_server) où il essaie de faire ceci: valeur = unicode (valeur) .Code ("UTF-8"). Comme vous pouvez le constater, j'utilise Python 2.6; Une version ultérieure des distutilles devrait être vraiment saignante.


Vous remarquerez que la reproduction nécessite que vous disposiez d'au moins un caractère non-ASCII dans le champ.


Je peux reproduire l'erreur "Python Setup.py registre" avec les trois versions de Python que j'ai ici: 2.4, 2.5 et 2.6.


Ajusté ma réponse - cela devrait aider maintenant


Soit Stackoverflow ne m'envoie pas de notifications lorsque les gens font cela, ou j'ai raté un. Merci pour la suggestion, le piratage SetDefaultencoding pourrait réellement fonctionner, si je pouvais surmonter ma très forte conviction que la modification du codage par défaut est la chose la plus mauvaise que vous puissiez faire dans un programme Python. ;-)



1
votes

Vous devez modifier votre description unicode longe description u "BLÄH BLÄHLäH" à une chaîne normale "Blã¤h Blã¤h Blã¤h" et ajoutez un en-tête de codage comme deuxième ligne de votre fichier: xxx

évidemment, vous devez enregistrer le fichier avec l'encodage UTF-8, également.


4 commentaires

"Si j'utilise une chaîne UTF-8 RAW pour le champ LONG_DESCRIPTION, la commande suivante se casse avec un UnicodeDecodeError: python setup.py registre"


pas une chaîne brute (r "blâh bläh"), juste une corde parfaitement normale dans la source. Cela a fonctionné pour moi simplement taper le code. Assurez-vous d'enregistrer le fichier avec le codage UTF-8. Vous avez dit que vous chargiez la vraie long_description d'un fichier texte. Il est possible que vous ne décodez pas correctement le texte lorsque vous le lisez dans le fichier. Assurez-vous de décoder le texte avec le codage correct pour le fichier texte.


J'ai des problèmes similaires à Marius. J'ai des UMLAUTS dans une modification.txt que j'utilise pour ma longue description. codecs.open (..., codage = ...), toutes les bonnes choses. Mais à la fin, "setup.py -long-description" fait une "impression" et "setup.py télécharger" fait un "Unicode ()". Et Unicode d'une chaîne codée UTF8 échoue et une impression d'une chaîne Unicode échoue. Raargh. Marius: Votre sale bidouillage fonctionne comme un charme.


Je n'aurais pas dû utiliser le mot "brut" pour désigner des objets STR avec des données codées UTF-8, désolé. Je peux garantir que le fichier sur disque est UTF-8.



6
votes

Il est apparemment un bogue de distutils qui a été corrigé dans Python 2.6: http://mail.python.org/pipermarmail/distutils-sig/2009-september/013275.html

tarek suggère de patcher post_to_server. Le patch doit pré-traiter toutes les valeurs de la Argument "Données" et les transformer en Unicode puis appelez la méthode d'origine. Voir http://mail.python.org/pipetermail/distutils- SIG / 2009-Septembre / 013277.html


0 commentaires