python 3.7.6 pip setup.py 使用 ContextualVersionConflict 进行测试

python 3.7.6 pip setup.py test with ContextualVersionConflict

我的 setup.py 如下所示:

from setuptools import find_packages, setup

tests_require = ['pytest-env', 'pytest-mock', 'pytest-cov', 'pytest-xdist', 'pytest', 'mock', 'moto<=1.3.10']

setup(
    name='repo_name',
    version='0.1.0',
    description='repo_name',
    keywords=['?'],
    packages=find_packages('src', exclude=['tests', 'venv']),
    package_dir={'': 'src'},
    package_data={'': ['schema/*.yaml']},
    install_requires=[
        'boto3<=1.10.19',
        'requests<=2.22.0',
        'jsonschema<=3.0.1',
        'objectpath<=0.6.1',
        'pyyaml<=5.1.1',
        'sqlalchemy<=1.3.5',
        'psycopg2-binary<=2.8.3',
        'auth-client<=1.0.23',   # internal package
        'policy_client<=1.0.9',  # internal package
        'audit-client<=1.1.20',  # internal package
        'flask<=1.1.1',
        'click<=7.0',
        'Werkzeug<=0.15.5',
        'itsdangerous<=1.1.0',
        'Jinja2<=2.10.1',
        'MarkupSafe<=1.1.1',
        'structlog<=19.2.0',
        'python-rapidjson<=0.9.1'
    ],
    setup_requires=['pytest-runner'],
    tests_require=tests_require,
    extras_require={'test': tests_require},
    include_package_data=True,
    zip_safe=False
)

当我 运行 python setup.py test 时,它总是会重新安装我已经安装的大部分软件包到 .eggs 文件夹中,我明白这一点。当它使用我在 install_requires 部分中提供的不同版本安装包时,会导致以下错误:

pkg_resources.ContextualVersionConflict: (urllib3 1.25.10 (/Users/***/Desktop/repo/.eggs/urllib3-1.25.10-py3.7.egg), Requirement.parse('urllib3<1.25,>=1.21.1'), {'requests'})

我必须将 requests 版本固定到 2.22.0,这要求 urllib3 版本不大于 1.25,这导致了我的问题。那么,无论如何我可以将 urllib3 版本固定在某个地方,以便当它 运行s 时,它只会安装提供的版本吗?我尝试在 install_requirestests_requirerequirements.txt 中添加 urllib3 版本,但到目前为止没有成功。

可能不是您想听到的,但是...setup_requirestests_require 已弃用 。尽管它们(可能)仍然(大部分)工作正常,但您可能想要寻找替代解决方案。据我所知,最常见的替代解决方案是使用 Tox instead of tests_require and PEP 517 替换 setup_requires.

在您的情况下,您使用 setup_requires 似乎只是您使用 tests_require 的结果。因此,通过切换到 Tox 之类的东西,您可以摆脱 tests_requiresetup_requires.

我决定简单地将 python setup.py test 替换为 pip instll -e . [test],然后直接 pytest

它仍然会安装所有 tests_require 软件包,然后直接 运行 pytest。而不是遍历所有列表包并找到所有包的最佳匹配版本。

更新:

真正的问题是我在更改软件包版本时没有删除旧的 .eggs/venv/ 文件夹。所以解决方案是在 setup.py 文件中将 requests 版本更新为 2.21.0,然后删除 .eggs/venv/ 文件夹并重新运行 一切。