3

SetupTools を使用した setup.py がある場合、特定のバージョンの Python に install_requires を指定する方法はありますか?

たとえば、私のモジュールの 1 つが OrderedDict を使用する必要がある場合、Python 2.7 未満のバージョンで PyPI から Ordereddict1.1 パッケージをインストールしたいのですが、それを Python に追加する理由はありません (おそらく悪い考えです)。 2.7 インストール。

これを処理する最良の方法は何ですか? バージョンごとに卵を分けますか?非純粋なモジュールに必要であることは知っていますが、これは純粋な Python になります。

4

2 に答える 2

4

これsetup.pyは単純な Python コードなので、セットアップ スクリプトのソース コードで行うこととまったく同じことを行います。


ドキュメントには、3.x と 2.x のコードを実行するためにスイッチを入れる方法が示されsys.version_infoていますが、2.7 と 2.6 のどちらでも同じように機能します。したがって、コードがこれを行っている場合:

if sys.version_info < (2, 7);
    from ordereddict import OrderedDict
else:
    from collections import OrderedDict

…そして、セットアップスクリプトはこれを行うことができます:

import sys
from setuptools import setup

extra_install_requires = []
if sys.version_info < (2, 7):
    extra_install_requires.append('ordereddict>=1.1')

setup(
    # ...
    install_requires = [...] + extra_install_requires,
    # ...
)

一方、コードがこれを行っている場合:

try:
    from collections import OrderedDict
except ImportError:
    from ordereddict import OrderedDict

…では、 を使用することもできversion_infoますが、次のようにすることもできます。

extra_install_requires = []
try:
    from collections import OrderedDict
except ImportError:
    extra_install_requires.append('ordereddict>=1.1')

いずれにせよ、たとえばpip-2.5 installこのパッケージの場合、モジュールをダウンロードしてインストールしordereddictます (ユーザーが 1.1 以降を持っていない場合)。2.7 では、Anthying は実行されません。


ビルド済みの卵を配布しようとしている場合は、そうです。Python 2.6 と 2.7 では結果が異なります。たとえば、 の後python2.6 setup.py bdist_egg && python2.7 setup.py bdist_eggは と にdist/Foo-0.1-py2.6.eggなりdist/Foo-0.1-py2.7.egg、両方を配布する必要があります。

于 2013-10-01T21:14:07.597 に答える
0

Python のバージョンを確認し、古い Python バージョンの要件を動的に追加することができます。

from setuptools import setup
import sys

install_requires = [
   # your global requirements
   # ...
]

if sys.version_info < (2, 7):
    install_requires.append('ordereddict >= 1.1')

setup(
    # ...
    install_requires=install_requires
    # ...
)
于 2013-10-01T21:13:20.283 に答える