首页 > 解决方案 > 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()

脚步:

  1. pip install -e .
  2. python setup.py test

环境:

我认为正在发生的事情

据我所知,在运行命令(安装和测试)时,setup_requires会安装来自的包,并将 egg 文件放在 .eggs 目录中。

运行时python setup.py test,setuptools 安装所有包,install_requires但发现其中一个依赖项已经有一个鸡蛋并使用它。

我不确定确切的机制是什么。

可能的解决方案

问题

尽管我能够在这种特定情况下解决问题,但我仍然想更多地了解最初是什么原因造成的。

标签: pythonsetuptools

解决方案


推荐阅读