python - Python包中'setup_requires'和'install_requires'之间的依赖冲突
问题描述
尝试安装和测试我的包时遇到错误。
该错误是由两个包的传递依赖的版本冲突引起的 - 一个在setup_requires
( twine
) 中,另一个在install_requires
( tensorflow
) 中。
两者都传递依赖bleach
,每个都有不同的版本。
pip install -e .
使用或python setup.py develop
按预期安装软件包。
运行python setup.py test
时出现错误(注意:只有在安装后运行测试时才会出现这种情况。如果没有先安装包,则没有错误)。
Traceback (most recent call last):
File "setup.py", line 3, in <module>
setup()
File "/usr/local/lib/python3.6/site-packages/setuptools/__init__.py", line 145, in setup
return distutils.core.setup(**attrs)
File "/usr/local/lib/python3.6/distutils/core.py", line 148, in setup
dist.run_commands()
File "/usr/local/lib/python3.6/distutils/dist.py", line 955, in run_commands
self.run_command(cmd)
File "/usr/local/lib/python3.6/distutils/dist.py", line 974, in run_command
cmd_obj.run()
File "/root/test/.eggs/pytest_runner-4.4-py3.6.egg/ptr.py", line 189, in run
with self.project_on_sys_path():
File "/usr/local/lib/python3.6/contextlib.py", line 81, in __enter__
return next(self.gen)
File "/usr/local/lib/python3.6/site-packages/setuptools/command/test.py", line 166, in project_on_sys_path
require('%s==%s' % (ei_cmd.egg_name, ei_cmd.egg_version))
File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 900, in require
needed = self.resolve(parse_requirements(requirements))
File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 791, in resolve
raise VersionConflict(dist, req).with_context(dependent_req)
pkg_resources.ContextualVersionConflict: (bleach 3.1.0 (/root/test/.eggs/bleach-3.1.0-py3.6.egg), Requirement.parse('bleach==1.5.0'), {'tensorboard'})
重现步骤
我得到这个最小包结构的错误:
my-package
|-- src/
| |-- module.py (empty)
|-- setup.py
|-- setup.cfg
setup.cfg 看起来像这样:
[metadata]
name = test
version = 0.0.1
[options]
package_dir=
= src
packages=find:
setup_requires =
setuptools >= 40.0.0
pip >= 10
pytest-runner >= 2.0
twine >= 1.0.0
install_requires =
tensorflow == 1.6.0
tests_require =
pytest >=3.0, <4.0
[options.packages.find]
where=src
[aliases]
test=pytest
setup.py 看起来像这样:
from setuptools import setup
setup()
脚步:
- 跑
pip install -e .
- 跑
python setup.py test
环境:
python:3.6
Docker 镜像
我认为正在发生的事情
据我所知,在运行命令(安装和测试)时,setup_requires
会安装来自的包,并将 egg 文件放在 .eggs 目录中。
运行时python setup.py test
,setuptools 安装所有包,install_requires
但发现其中一个依赖项已经有一个鸡蛋并使用它。
我不确定确切的机制是什么。
可能的解决方案
- 使用较新版本的 tensorflow。这解决了冲突
- 或者:删除
twine
-setup_requires
我意识到设置不需要它 - 或者:不要在本地安装包。只运行
python setup.py test
问题
尽管我能够在这种特定情况下解决问题,但我仍然想更多地了解最初是什么原因造成的。
- .eggs 目录是在什么时候创建的?
- 为什么安装工作正常但测试失败?
- 为什么只有在安装后测试才会失败?
- 有没有办法防止冲突发生?
解决方案
推荐阅读
- git - 试图理解/确定一个基本的 Git 工作流程
- typescript - 带有参数的 ASP .net 核心 HttpGet 导致错误请求
- php - PHP表单数组插入MySQL表时有空值
- python - 将字符串作为日期时间对象读入,毫秒为 3 位
- karate - 空手道 API:将两个数组转换为一个对象
- python - 如何通过 Powershell 异步从远程机器运行 Python 脚本?
- c# - 是否可以在公共财产中同时获得和设置私有?
- python - 根据 ID 列的值创建一个新列
- random - Julia:生成范围受限的正态分布随机数
- python - python导入一个非标准库