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_requires
、tests_require
和 requirements.txt
中添加 urllib3 版本,但到目前为止没有成功。
可能不是您想听到的,但是...setup_requires
和 tests_require
已弃用 。尽管它们(可能)仍然(大部分)工作正常,但您可能想要寻找替代解决方案。据我所知,最常见的替代解决方案是使用 Tox instead of tests_require
and PEP 517 替换 setup_requires
.
在您的情况下,您使用 setup_requires
似乎只是您使用 tests_require
的结果。因此,通过切换到 Tox 之类的东西,您可以摆脱 tests_require
和 setup_requires
.
我决定简单地将 python setup.py test
替换为 pip instll -e . [test]
,然后直接 pytest
。
它仍然会安装所有 tests_require
软件包,然后直接 运行 pytest
。而不是遍历所有列表包并找到所有包的最佳匹配版本。
更新:
真正的问题是我在更改软件包版本时没有删除旧的 .eggs/ 和 venv/ 文件夹。所以解决方案是在 setup.py 文件中将 requests
版本更新为 2.21.0,然后删除 .eggs/ 和 venv/ 文件夹并重新运行 一切。
我的 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_requires
、tests_require
和 requirements.txt
中添加 urllib3 版本,但到目前为止没有成功。
可能不是您想听到的,但是...setup_requires
和 tests_require
已弃用 。尽管它们(可能)仍然(大部分)工作正常,但您可能想要寻找替代解决方案。据我所知,最常见的替代解决方案是使用 Tox instead of tests_require
and PEP 517 替换 setup_requires
.
在您的情况下,您使用 setup_requires
似乎只是您使用 tests_require
的结果。因此,通过切换到 Tox 之类的东西,您可以摆脱 tests_require
和 setup_requires
.
我决定简单地将 python setup.py test
替换为 pip instll -e . [test]
,然后直接 pytest
。
它仍然会安装所有 tests_require
软件包,然后直接 运行 pytest
。而不是遍历所有列表包并找到所有包的最佳匹配版本。
更新:
真正的问题是我在更改软件包版本时没有删除旧的 .eggs/ 和 venv/ 文件夹。所以解决方案是在 setup.py 文件中将 requests
版本更新为 2.21.0,然后删除 .eggs/ 和 venv/ 文件夹并重新运行 一切。