如果我使用SetupTools有一个setup.py,有没有办法为特定版本的Python指定install_requires?
例如,如果我的一个模块需要使用OrderedDict,我希望Python< 2.7的版本从PyPI安装ordereddict1.1包,但是没有理由(并且可能是一个坏主意)添加那就是Python 2.7安装。
处理此问题的最佳方法是什么?不同版本的鸡蛋分开?我知道这对于非纯模块是必要的,但这将是纯Python。
答案 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.egg
和dist/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
# ...
)