setup.py에서 유니 코드 메타 데이터를 사용하는 올바른 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1162338

  •  18-09-2019
  •  | 
  •  

문제

Setuptools를 사용하여 Python 패키지 용 Setup.py를 작성했으며 Long_Description 필드에 비 ASCII 문자를 포함시키고 싶었습니다.

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

불행히도, 유니 코드 객체를 setup ()로 전달하는 것은 유니 코드 넥코드 에러로 다음 두 명령 중 하나를 깨뜨립니다.

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

long_description 필드에 RAW UTF-8 문자열을 사용하면 다음 명령이 유니 코드 코드 오해로 나뉩니다.

python setup.py register

나는 일반적으로 'python setup.py sdist register upload'를 실행하여 소프트웨어를 출시합니다. 즉, sys.argv를보고 올바른 개체 유형을 통과하는 추악한 해킹이 바로 나옵니다.

결국 나는 다른 못생긴 해킹을 포기하고 구현했습니다.

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

더 나은 방법이 없습니까?

도움이 되었습니까?

해결책

파이썬 2.6에서 고정 된 Distutils 버그입니다. http://mail.python.org/pipermail/distutils-sig/2009-september/013275.html

Tarek은 Patch Post_to_server를 제안합니다. 패치는 "데이터"인수의 모든 값을 사전 처리하고 유니 코드로 전환 한 다음 원래 메소드를 호출해야합니다. 보다 http://mail.python.org/pipermail/distutils-sig/2009-september/013277.html

다른 팁

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

위의 코드로 테스트하고 있습니다. -long -description의 오류가 없습니다. RST2HTML에서만; 업로드는 작동하지 않는 것 같습니다 (실제로 업로드를 취소하더라도) 및 register는 내가없는 사용자 이름을 요청합니다. 그러나 귀하의 의견의 추적은 도움이됩니다. 자동 변환입니다. unicode 에서 register 문제를 일으키는 명령.

보다 환상적인 setDefaultEncoding 이에 대한 자세한 내용은 기본적으로 Python의 기본 인코딩이 인코딩 된 문자열을 유니 코드로 다시 변환 할 수 있기를 원하지만이를 설정하는 것은 까다 롭습니다. 이 경우 나는 노력의 가치가 있다고 생각합니다.

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

또는 정확히 말하면 당신은 그것을 locale - 코드가 댓글을 달았습니다 /usr/lib/python2.6/site.py 당신이 이것을 찾을 수는 있지만 지금은 그 토론을 떠날 것입니다.

유니 코드 긴 설명을 변경해야합니다 u"bläh bläh bläh" 일반 문자열로 "bläh bläh bläh" 인코딩 헤더를 파일의 두 번째 줄로 추가하십시오.

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

분명히 UTF-8 인코딩으로 파일을 저장해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top