你能在setuptools中为Python 2和3设置条件依赖吗?

时间:2013-10-30 02:52:26

标签: python dependency-management setuptools

在发布支持Python 2和3的Python egg时,您是否可以指定根据您使用的版本而更改的依赖项?例如,如果对Python 2使用dnspython,则会有一个名为dnspython3的Python 3版本。

你能编写setuptools.setup()函数,这样你的鸡蛋可用于两个版本,如果这是唯一的障碍,即,如果你已经运行2to3以确保你的其余部分library与这两个版本兼容。

我查看过这些文件似乎找不到这个问题的答案:

3 个答案:

答案 0 :(得分:19)

波格丹的评论帮助我指明了方向。我以为我会发布我所做的事情以防其他人遇到我的问题。

对于问题中的例子,我完全按照波格丹的建议行事:

setup.py

import sys

if sys.version_info[0] == 2:
    dnspython = "dnspython"
elif sys.version_info[0] == 3:
    dnspython = "dnspython3"

setup(
    ... <snip> ...
    install_requires=[
        "%s >= 1.10.0" % dnspython,
    ]
)

然而,这仍然存在Travis和tox的pip风格依赖问题(鉴于Bogdan的第二条评论,我不知道为什么)。为了解决这个问题,我创建了两个额外的需求文件,如下所示:

要求-py2.txt

dnspython>=1.10.0

要求-py3.txt

dnspython3>=1.10.0

然后对于Travis,我使用了一些我从tornado .travis.yml收集到的环境变量:

.travis.yml

install:
  - if [[ $TRAVIS_PYTHON_VERSION == 2* ]]; then pip install -r requirements-py2.txt --use-mirrors; fi
  - if [[ $TRAVIS_PYTHON_VERSION == 3* ]]; then pip install -r requirements-py3.txt --use-mirrors; fi

最后,对于tox,我不得不使用一种相当hackish的方法来使用这些多个需求文件。

tox.ini

[testenv:py27]
deps = -rrequirements-py2.txt

[testenv:py33]
deps = -rrequirements-py3.txt

答案 1 :(得分:3)

@Harold回答的setup.py部分对我不起作用:pip install distribution.whl仍然会安装if代码说不应该的依赖项。我将在解决此问题后的几天内进一步更新此答案。

以下是一些可能提供其他方法来处理此问题的链接:(

答案 2 :(得分:1)

对于大多数相关但不完全相关的内容,请参阅我的回答https://stackoverflow.com/a/25078063/302521和此脚本:https://gist.github.com/pombredanne/72130ee6f202e89c13bb