当发布一个同时支持 Python 2 和 3 的 Python egg 时,你能指定依赖项,这些依赖项会根据你使用的版本而改变吗?例如,如果您使用dnspython
Python 2,则有一个 Python 3 版本,称为dnspython3
.
setuptools.setup()
如果这是唯一的障碍,即,如果您已经运行2to3
以确保库的其余部分与两个版本兼容,您能否以这样一种方式编写您的函数,即您的 egg 对两个版本都可用。
我浏览了这些文件,似乎无法找到这个问题的答案:
当发布一个同时支持 Python 2 和 3 的 Python egg 时,你能指定依赖项,这些依赖项会根据你使用的版本而改变吗?例如,如果您使用dnspython
Python 2,则有一个 Python 3 版本,称为dnspython3
.
setuptools.setup()
如果这是唯一的障碍,即,如果您已经运行2to3
以确保库的其余部分与两个版本兼容,您能否以这样一种方式编写您的函数,即您的 egg 对两个版本都可用。
我浏览了这些文件,似乎无法找到这个问题的答案:
博格丹的评论帮助我指明了方向。我想我会发布我所做的,以防其他人遇到我的问题。
对于问题中的示例,我完全按照 Bogdan 的建议进行了操作:
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 的第二条评论,我不确定为什么)。为了解决这个问题,我创建了两个额外的需求文件,如下所示:
dnspython>=1.10.0
dnspython3>=1.10.0
然后对于 Travis,我使用了从龙卷风 .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
@Harold 答案的 setup.py 部分对我不起作用: pip install distribution.whl 仍然安装 if 代码说它不应该安装的依赖项。解决此问题后,我将在几天内进一步更新此答案。
以下是一些可能提供处理此 () 的其他方法的链接:
对于大部分相关但不完全相关的内容,请参阅我的答案https://stackoverflow.com/a/25078063/302521和此脚本:https ://gist.github.com/pombredanne/72130ee6f202e89c13bb