Pergunta

Eu estava escrevendo um setup.py para um pacote de Python usando setuptools e queria incluir um caractere não-ASCII no 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
      ...)

Infelizmente, passando um objeto unicode para setup () quebras de qualquer um dos dois comandos a seguir com um UnicodeEncodeError

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

Se eu usar uma corda crua UTF-8 para o campo long_description, então o seguinte comando interrompe com um UnicodeDecodeError:

python setup.py register

Eu geralmente liberar software executando 'python setup.py sdist registar upload', o que significa hacks feios que olhar para sys.argv e passar o tipo de objeto direita são para fora da direita.

No final, eu desisti e implementou um corte feio diferente:

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ão há uma maneira melhor?

Foi útil?

Solução

É aparentemente um bug distutils que foi corrigido no Python 2.6: http://mail.python.org/pipermail/distutils-sig/2009-September/013275.html

Tarek sugere a post_to_server remendo. O adesivo deve pré-processar todos os valores na argumento "dados" e transformá-los em unicode e, em seguida, chamar o método original. Consulte http://mail.python.org/pipermail/distutils -sig / 2009-setembro / 013277.html

Outras dicas

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

Estou testando com o código acima - não há nenhum erro de --long-descrição, apenas a partir de rst2html; carregamento parece funcionar bem (embora eu cancelar realmente upload) e registo pede-me para o meu nome de usuário que eu não tenho. Mas o rastreamento em seu comentário é útil. - É a conversão automática para unicode no comando register que causa o problema

setdefaultencoding ilusória para mais informações sobre este - basicamente você deseja que o padrão codificação em Python para ser capaz de converter a sua volta string codificada para unicode, mas é complicado para configurar isso. Neste caso, eu acho que vale a pena o esforço:

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

Ou mesmo ser correto você pode obtê-lo a partir do locale -. Há código comentado no /usr/lib/python2.6/site.py que você pode achar que faz isso, mas eu vou deixar essa discussão para agora

Você precisa mudar seu unicode descrição longa u"bläh bläh bläh" a um "bläh bläh bläh" seqüência normal e adicionar um cabeçalho de codificação como a segunda linha do seu arquivo:

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

Obviamente, você precisa salvar o arquivo com codificação UTF-8, também.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top