Was ist der richtige Weg, Unicode-Metadaten in setup.py zu benutzen?
-
18-09-2019 - |
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?
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.