25

当发布一个同时支持 Python 2 和 3 的 Python egg 时,你能指定依赖项,这些依赖项会根据你使用的版本而改变吗?例如,如果您使用dnspythonPython 2,则有一个 Python 3 版本,称为dnspython3.

setuptools.setup()如果这是唯一的障碍,即,如果您已经运行2to3以确保库的其余部分与两个版本兼容,您能否以这样一种方式编写您的函数,即您的 egg 对两个版本都可用。

我浏览了这些文件,似乎无法找到这个问题的答案:

4

3 回答 3

23

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

对于问题中的示例,我完全按照 Bogdan 的建议进行了操作:

安装程序.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 的 pip 样式依赖问题,并且tox(鉴于 Bogdan 的第二条评论,我不确定为什么)。为了解决这个问题,我创建了两个额外的需求文件,如下所示:

要求-py2.txt

dnspython>=1.10.0

要求-py3.txt

dnspython3>=1.10.0

然后对于 Travis,我使用了从龙卷风 .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,我不得不使用一种相当老套的方法来使用这些多个需求文件。

毒物

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

[testenv:py33]
deps = -rrequirements-py3.txt
于 2013-11-01T01:58:12.360 回答
4

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

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

于 2016-10-16T02:58:14.383 回答
1

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

于 2014-08-01T10:25:01.793 回答