基于Python版本处理依赖关系的最佳方法是什么?

时间:2013-10-01 20:54:36

标签: python setuptools

如果我使用SetupTools有一个setup.py,有没有办法为特定版本的Python指定install_requires?

例如,如果我的一个模块需要使用OrderedDict,我希望Python< 2.7的版本从PyPI安装ordereddict1.1包,但是没有理由(并且可能是一个坏主意)添加那就是Python 2.7安装。

处理此问题的最佳方法是什么?不同版本的鸡蛋分开?我知道这对于非纯模块是必要的,但这将是纯Python。

2 个答案:

答案 0 :(得分:4)

您的setup.py只是简单的Python代码,因此您在安装脚本中执行与源代码完全相同的操作。


该文档显示了如何打开sys.version_info以执行3.x与2.x代码,但它与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,它不会做贡献。


如果你想分发预先制作的鸡蛋,那么是的,它们最终会因Python 2.6和2.7而异。例如,在python2.6 setup.py bdist_egg && python2.7 setup.py bdist_egg之后,您最终会得到dist/Foo-0.1-py2.6.eggdist/Foo-0.1-py2.7.egg,并且您必须分发这两者。

答案 1 :(得分: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
    # ...
)