python - 如何处理 setup.py 覆盖子包依赖
问题描述
我面临的问题是 setuptools 覆盖了子包依赖项要求。
例子:
安装程序.py
import os
from setuptools import setup
setup(
name="test",
version="0.1",
author="myself",
author_email="info@example.com",
description="How to manage dependencies?",
license="MIT",
classifiers=[
"Development Status :: 3 - Alpha"
],
zip_safe=False,
install_requires=[
'dependency-injector',
]
)
安装成功通过python setup.py install
输出:
(venv) alex@ws:~$ pip freeze
dependency-injector==3.14.12
six==1.12.0
test==0.1
如果您使用以下 setup.py包括六个作为依赖项(因为您在包中需要它),那么您会遇到问题,因为依赖注入器也需要依赖项,尽管它们已经定义了固定的版本范围。
import os
from setuptools import setup
setup(
name="test",
version="0.1",
author="myself",
author_email="info@example.com",
description="How to manage dependencies?",
license="MIT",
classifiers=[
"Development Status :: 3 - Alpha"
],
zip_safe=False,
install_requires=[
'dependency-injector',
'six'
]
)
输出:
error: six 1.13.0 is installed but six<=1.12.0,>=1.7.0 is required by {'dependency-injector'}
(venv) alex@ws:~$ pip freeze
dependency-injector==3.14.12
six==1.13.0
test==0.1
当然,一个可行的解决方案只是重复依赖注入器使用的相同的六个版本范围(请参阅他们的仓库中的requirements.txt文件),尽管我真的很想避免这种重复的依赖定义,因为例如依赖注入器可能升级六个版本的依赖,因此我还需要更新我的包。因此,我将始终尝试模仿他们的要求,这是不好的做法。
我认为实际上唯一干净的解决方案是 setuptools 建立一个依赖树,然后使用符合所有依赖项要求的版本。这是现实的吗?在上述情况下,如何实现或推荐的最佳实践是什么?
解决方案
TL;DR 的答案是pip
目前没有依赖求解器。
pip
关于该主题的问题跟踪器存在一个持续的问题: https ://github.com/pypa/pip/issues/988
他们说的是当前pip
的行为是“首先找到的胜利”,所以你的顶级 - level依赖关系在's依赖关系six
之前解决,这就是为什么你最终安装了最新版本的原因。dependency-injector
six
six
在python setup.py install
vs.pip install .
问题上,这两个命令之间似乎存在细微差别。他们内部不使用相同的工具,推荐的命令pip install .
一般是
(来源:https ://stackoverflow.com/a/15731459/9977650,https : //github.com/pypa/setuptools/issues/960)
推荐阅读
- powershell - 当您的 json 文件包含键值对而不是键值对时,如何使用 export-CSV?
- django - Django 错误:用户匹配查询不存在
- docusignapi - 来自带有nodejs的模板的Docusign嵌入式签名请求
- r - ggplot2如何将线和箱线图时间序列与自定义颜色相结合
- python - 无法导入问题
- android - 材料设计日期选择器android更改布局
- caching - 部署后,Angular PWA 服务工作者不会在离线模式下从缓存中获取 api 响应
- excel - 重命名 Excel 工作表:名称超过 31 个字符错误
- powerbi - PowerBI中突出显示视觉交互的默认过滤器
- python - 如何以编程方式检测文件是否为 Python 脚本