setuptools:强制另一个包的版本(如果存在),同时不强制安装此包(如果不存在)

时间:2017-06-20 17:10:39

标签: python pip setuptools

在开发Pylint期间,我们遇到了interesting problem related to non-dependency that may break pylint package

案例如下:

  • python-futureconfigparser包的别名冲突。 Quoting official docs
      

    此版本删除了configparser软件包,作为Py2上ConfigParser的别名,以提高与Lukasz Langa的backported configparser软件包的兼容性。以前python-future和configparser backport冲突,导致各种兼容性问题。 (问题#118,#181)

  • python-future本身不是 Pylint的依赖

如果存在python-future,强制执行的标准方法是什么,强制它为0.16或更高版本限制?我想避免将依赖关系定义为future>=0.16 - 通过这样做,我强制用户安装他们不需要的包,并且在一般情况下不会使用。

3 个答案:

答案 0 :(得分:2)

kw = {}
try:
    import future
except ImportError:
    pass
else:
    kw['install_requires'] = ['future>=0.16']

setup(
    …
    **kw
)

答案 1 :(得分:0)

此问题的一种解决方法是仅为all目标定义此要求,因此,只有当某人添加pylint[all]>=1.2.3作为要求时,才会安装/升级期货。

此刻我不知道另一种方式来忽略或升级"依赖。

另外,我会避免将Python代码添加到setup.py以使其成为" smart",...是众所周知的分布式反模式;)

答案 2 :(得分:0)

没有支持的方法来告诉pip或setuptools只有在安装时包需要满足约束。可能会有一些黑客,但我想他们都会很脆弱,可能会破坏pip / setuptools的未来版本。

老实说,唯一的良好的方式是在文档中的适当位置为future < 16.0打破pylint的用户记录它。

让你的setup.py脚本包含条件依赖项已经被强烈劝阻了一段时间了。一旦构建了一个轮子,就会安装包与轮子保持相同的依赖信息 - setup.py不在最终用户的系统上运行,只在打包器的系统上运行,这意味着任何setup.py hack(如@phd的)没有用(因为pylint分配轮子)。