Frage

Ich war ein setup.py für ein Python-Paket zu schreiben mit Setuptool und wollte ein Nicht-ASCII-Zeichen im long_description Feld enthalten:

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

Leider Objekt für das Einrichten eines Unicode () über bricht eine der folgenden zwei Befehle mit einem UnicodeEncodeError

python setup.py --long-description | rst2html
python setup.py upload

Wenn ich ein rohes UTF-8-String für das long_description Feld, dann ist der folgende Befehl bricht mit einem UnicodeDecodeError:

python setup.py register

Ich lasse im Allgemeinen Software von ‚Python setup.py Upload Sdist registriert‘ laufen, die hässlichen Hacks bedeutet, die in sys.argv schauen und den richtigen Objekttyp sind direkt aus passieren.

Am Ende gab ich auf und implementiert eine andere hässliche Hack:

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

Gibt es nicht einen besseren Weg?

War es hilfreich?

Lösung

Es ist offensichtlich ein Fehler, die distutils 2.6 in Python behoben wurde: http://mail.python.org/pipermail/distutils-sig/2009-September/013275.html

Tarek schlägt Patch post_to_server. Das Pflaster sollte vorverarbeiten alle Werte in der „Daten“ Argument und sie in Unicode und dann die ursprüngliche Methode aufrufen. Siehe http://mail.python.org/pipermail/distutils -sig / 2009-September / 013277.html

Andere Tipps

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

ich mit dem obigen Code bin Tests - es ist kein Fehler von --long-Beschreibung, nur von rst2html; Upload scheint OK zu arbeiten (obwohl ich eigentlich abbrechen Upload) und Register fragt mich nach meinem Benutzernamen, die ich nicht habe. Aber die Zurückverfolgungs in Ihrem Kommentar ist hilfreich -. Es ist die automatische Konvertierung in dem unicode Befehl register, das das Problem verursacht

Siehe der illusorischen setDefaultEncoding für weitere Informationen über diese - im Grunde Sie den Standard wollen Codierung in Python in der Lage sein Ihre codierten Zeichenfolge wieder in Unicode zu konvertieren, aber es ist schwierig, diese einzurichten. In diesem Fall denke ich, es ist die Mühe wert:

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

Oder auch als richtig Sie es von der locale bekommen können - gibt es Code in /usr/lib/python2.6/site.py kommentierte, dass Sie das tut dies finden können, aber ich werde diese Diskussion jetzt verlassen

.

Sie benötigen eine Unicode lange Beschreibung u"bläh bläh bläh" zu einem normalen String "bläh bläh bläh" ändern und eine Codierung Header als die zweite Zeile der Datei hinzu:

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

Natürlich müssen Sie die Datei mit UTF-8-Codierung speichern, zu.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top