Domanda

stavo scrivendo un setup.py per un pacchetto Python utilizzando setuptools e volevo includere un carattere non ASCII nel 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
      ...)

Sfortunatamente, passando un oggetto unicode di setup () rompe uno dei seguenti due comandi con un UnicodeEncodeError

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

Se io uso una stringa UTF-8 prima per il campo long_description, poi i seguenti rompe comando con un UnicodeDecodeError:

python setup.py register

Io in genere release del software eseguendo 'setup.py pitone sdist registro caricati', il che significa brutte hack che guardano in sys.argv e passano il tipo di oggetto a destra sono proprio fuori.

Alla fine ho rinunciato e implementato un diverso brutto 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("..."),
      ...)

Non c'è un modo migliore?

È stato utile?

Soluzione

Si tratta a quanto pare di un bug distutils che è stato fissato in Python 2.6: http://mail.python.org/pipermail/distutils-sig/2009-September/013275.html

Tarek suggerisce di cerotto post_to_server. Il cerotto deve pre-processo di tutti i valori nella argomento "dati" e trasformarle in unicode e quindi chiamare il metodo originale. Vedere http://mail.python.org/pipermail/distutils -sig / 2009-settembre / 013277.html

Altri suggerimenti

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

sto testando con il codice di cui sopra - non v'è alcun errore dal --long-descrizione, solo rst2html; Carica sembra funzionare OK (anche se in realtà annullare il caricamento) e il registro mi chiede il mio nome utente, che non ho. Ma il traceback nel vostro commento è utile -. È la conversione automatica a unicode nel comando register che causa il problema

il setdefaultencoding illusoria per ulteriori informazioni su questo - in sostanza si desidera che il valore predefinito codifica in Python per essere in grado di convertire la stringa codificata torna a unicode, ma è difficile da impostare questa funzione. In questo caso penso che sia valsa la pena:

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

O anche essere corretta si può ottenere dal locale - c'è codice commentato in /usr/lib/python2.6/site.py che si può trovare che fa questo ma lascio che la discussione per ora

.

È necessario modificare la vostra unicode descrizione lunga u"bläh bläh bläh" ad un normale "bläh bläh bläh" stringa e aggiungere un'intestazione di codifica come la seconda riga del file:

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

Ovviamente, è necessario salvare il file con codifica UTF-8, anche.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top