2009-07-21 9 views
8

私はsetuptoolsのを使ってPythonパッケージのsetup.pyを書き込み、LONG_DESCRIPTIONフィールドに非ASCII文字を含めるたかった:Unicodeメタデータをsetup.pyで使用する正しい方法は何ですか?

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

、セットアップにUnicodeオブジェクトを渡すことは、()のいずれかを破ります私はLONG​​_DESCRIPTIONフィールドの生のUTF-8文字列を使用している場合UnicodeEncodeErrorを

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

と2つのコマンドを以下、UnicodeDecodeErrorで次のコマンドブレーク:

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

がより良い方法ではないですか?私は上記のコードでテストしてい

答えて

5

それは明らかにのpython 2.6で修正されているdistutilsのバグです:http://mail.python.org/pipermail/distutils-sig/2009-September/013275.html

タレクはpost_to_serverパッチを適用することを示唆しています。パッチは "data"引数のすべての値を前処理し、それらをユニコードに変換して元のメソッドを呼び出す必要があります。 http://mail.python.org/pipermail/distutils-sig/2009-September/013277.html

3
#!/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="[email protected]", 
     url="http://en.wikipedia.org/wiki/Fudz", 
    ) 

は、 - だけrst2htmlから--long-説明から、誤りがありません。アップロードは正常に機能しているようです(実際にはアップロードをキャンセルします)。登録すると、私の持っていないユーザー名が登録されます。しかし、あなたのコメントのトレースバックが役立ちます - それは問題を引き起こすregisterコマンドのunicodeへの自動変換です。

これについての詳細は、the illusive setdefaultencodingを参照してください。基本的には、エンコードされた文字列をユニコードに変換できるように、Pythonのデフォルトエンコーディングを元に戻したいのですが、これを設定するのは難しいことです。この場合、私はそれは努力の価値だと思う:

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

、あるいはあなたがlocaleからそれを得ることができる正しいと - あなたが見つけることができる/usr/lib/python2.6/site.pyでコメントアウトコードがありますそれは、これを行いますが、私はその議論を残しておきます今のところ。あなたは、通常の文字列"bläh bläh bläh"にあなたのユニコード長い説明u"bläh bläh bläh"を変更し、ファイルの2行目としてエンコーディングヘッダを追加する必要が

+0

完全なトレースバックをコメントに貼り付けることはできません。トレースバックは/usr/lib/python2.6/distutils/command/register.py行264(post_to_server内)で終了します。これは、value = unicode(value).encode( "utf-8")です。ご覧のとおり、私はPython 2.6を使用しています。 distutilsのそれ以降のバージョンは、本当に最先端のものを出す必要があります。 –

+0

あなたは実際にフィールドに少なくとも1つの非ASCII文字が必要であることに注意してください。 –

+0

私は 'python setup'を再現できます。私がここにあるPythonの3つのバージョン(2.4,2.5、および2.6)すべてで、「pyレジスタ」エラーが発生します。 –

1

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

、あなたはUTF-8でファイルを保存する必要がありますエンコーディングも。

+0

"long_descriptionフィールドに未処理のUTF-8文字列を使用すると、次のコマンドはUnicodeDecodeErrorで破損します。python setup.py register" –

+0

_未加工文字列(r "blähbläh")ソース内の通常の文字列。 コードを入力するだけでうまくいきました。 UTF-8エンコーディングでファイルを保存していることを確認してください。 テキストファイルから実際のlong_descriptionをロードしていたとします。ファイルから読み込んだときにテキストを正しくデコードしていない可能性があります。テキストファイルの正しいエンコードでテキストをデコードすることを確認してください。 – wbg

+0

私はマリウスにも同様の問題があります。私は長い記述のために使用するCHANGES.txtにウムラウトを持っています。 codecs.open(...、encoding = ...)、すべての正しいもの。しかし、結局、 "setup.py --long-description"は "print"を行い、 "setup.py upload"は "unicode()"を行います。また、utf8でエンコードされた文字列のユニコードが失敗し、ユニコード文字列の出力が失敗します。 RAARGH。 マリウス:あなたの汚れたハックは魅力のように機能します。 –

関連する問題