2012-06-28 11 views
5

現在のところ、私のパッケージにはJSONパーサ/エンコーダが必要です。simplejsonが利用可能であれば、jsonモジュール(標準ライブラリ内)に戻すように設計されています(ベンチマークではsimplejsonが高速です)。オプションのパッケージをsetuptoolsで定義することはできますか?

しかし、最近、zc.buildoutを使用しているときsimplejsonをインストールするかどうかのよう&ミスをヒットされています - githubのへの移行で何か、私は信じています。それで私は不思議に思った。私のsetup.pyファイルにオプションのパッケージを定義することは可能ですか?利用できない場合、私のパッケージのインストールを止めませんか?

答えて

0

AFAIKオプションのパッケージを定義する方法はありません。そのためには使用できません。オプションのパッケージを定義するときに何を期待していますか?まだ使用できないときにインストールされていることを確認しますか? (それはどうにかして義務づけられます)

いいえ、これを解決する正しい方法は、あなたがパッケージを使用したい場所でのインポートです。例えば:もちろん

try: 
    from somespecialpackage import someapi as myapi 
except ImportError: 
    from basepackage import theapi as myapi 

これは、2つのAPIに互換性があることが必要ですが、これはsimplejsonの場合と標準ライブラリjsonパッケージです。

+2

オプションパッケージはに失敗した場合ことを意味するあなたのjson輸入のためにインストールすると、インストールが妨げられずに完了できます。 –

+0

さて、もしあなたが*パッケージに依存していないのであれば、どうして*必須のパッケージ*に入れるのですか?私は単にポイントを取得しません。 – Constantinius

+0

私はそれを 'required'リストに入れたくありません。それは私が求めていることです - 別のオプションがありますので、もしそれが含まれていればそれを含めることができますが、もしそうでなければ無視しますか? –

6

インストール時のオプションパッケージ。

私はあなたのsetup.pyスクリプトについて話していると仮定しています。 あなたは持っている、それを変更することができます:

# mypackage/setup.py 

extras = { 
    'with_simplejson': ['simplejson>=3.5.3'] 
} 

setup(
    ... 
    extras_require=extras, 
    ...) 

が、あなたはのいずれかの操作を行うことができます

  • pip install mypackage
  • pip install mypackage[with_simplejson]

を、後者はsimplejson>=3.5.3をインストールすると。

すべてをインストールし、既知の良いバージョンにフォールバックしようとするのではなく、動作していると思われるパッケージのサブセットをインストールすることをお勧めします。

実行時のオプションパッケージ。

インストール可能なパッケージのセットが2つ異なる場合は、 が必要です(使用可能な場合)。例えば。

try: 
    # helpful comment saying this should be faster. 
    import simplejson as json 
except ImportError: 
    import json 

別のより複雑な例:

try: 
    # xml is dangerous 
    from defusedxml.cElementTree import parse 
except ImportError: 
    try: 
     # cElementTree is not available in older python 
     from xml.cElementTree import parse 
    except ImportError: 
     from xml.ElementTree import parse 

しかし、あなたはまた、いくつかのパッケージでは、このパターンを見つけることができます。

try: 
    optional_package = None 
    import optional.package as optional_package 
except ImportError: 
    pass 

... 

if optional_package: 
    # do addtional behavior 
関連する問題