Python setuptools:强制安装另一个软件包(如果存在),而不强制安装此软件包(如果不存在)
在Pylint的开发过程中,我们遇到了一些问题 案件如下:Python setuptools:强制安装另一个软件包(如果存在),而不强制安装此软件包(如果不存在),python,pip,setuptools,Python,Pip,Setuptools,在Pylint的开发过程中,我们遇到了一些问题 案件如下: python future与configparser包的别名冲突: 此版本删除了作为Py2上configparser别名的configparser包,以提高与Lukasz Langa的后端口configparser包的兼容性。以前,python future和configparser后端口发生冲突,导致各种兼容性问题。(第118期、第181期) python future本身不是Pylint的依赖项 如果存在python futu
与python future
包的别名冲突: 此版本删除了作为Py2上configparser别名的configparser包,以提高与Lukasz Langa的后端口configparser包的兼容性。以前,python future和configparser后端口发生冲突,导致各种兼容性问题。(第118期、第181期)configparser
本身不是Pylint的依赖项python future
如果存在python future,将其强制为0.16或更高版本的限制,那么标准的强制方式是什么?我想避免将依赖性定义为
future>=0.16
——这样做会迫使用户安装他们不需要且在一般情况下不会使用的软件包。此问题的一个解决方法是仅为all
目标定义此要求,因此只有在有人添加pylint[all]时才需要>=1.2.3
根据要求,他们将安装/升级futures
kw = {}
try:
import future
except ImportError:
pass
else:
kw['install_requires'] = ['future>=0.16']
setup(
…
**kw
)
此时此刻,我不知道另一种“忽略或升级”依赖项的方法
此外,为了使其“智能化”,我会避免将Python代码添加到
setup.py
,。。。是众所周知的分布反模式;) 没有受支持的方法告诉pip或setuptools只有在安装了软件包后才需要满足约束。可能会有一些黑客攻击,但我认为它们都很脆弱,可能会在未来版本的pip/setuptools中崩溃
老实说,唯一的好方法是为那些future<16.0
会破坏pylint的用户在文档中的适当位置编写文档
让您的
setup.py
脚本包含条件依赖项是一段时间以来一直强烈反对的做法。一旦构建了一个控制盘,该软件包将使用与控制盘相同的依赖信息进行安装-setup.py不会在最终用户的系统上运行,只会在打包机的系统上运行,这意味着任何setup.py hack(如@phd)都没有用(因为pylint分发控制盘).听起来您所描述的只是python future
中的一个bug,它可能会影响执行导入configparser
的任何代码。对吗?如果是这样,用你自己的依赖列表来“修复”它似乎是没有意义的。@BrenBarn好吧,客户不同意。你们可以在相关问题下看到相当热烈的讨论。这就是我问这个问题的原因——为了弄清楚是否有一种聪明的方法来处理这个给很多人带来麻烦的极不寻常的案例。在讨论结束时,你有没有回答这个问题:“什么需要未来还是未来?”似乎理解这一点对于理解如何解决问题非常重要。由于install\u requires
参数的不可表达性,s是Python社区指定条件依赖项的唯一有意义的方法。告诫开发人员在绝对必要的时候这样做并没有特别大的帮助。有帮助的是对phd方法的扩展,添加setup.py
和处理特定于轮子的边缘情况的应用程序逻辑。这是。就快到了。如前所述,这种方法无法扩展到轮子。假设本地开发环境安装了python-future
,轮子用户将被迫安装python-future
>=0.16。然而,这并不是最糟糕的事情。一个基本上是有效的解决方案必须付出很小的代价。