使用pip/pipenv安装TestPyPI自有包时遭遇依赖冲突错误
问题:自有Python包安装时出现跨版本依赖冲突,错误提示依赖包随机变化
我用setup.py创建了个人Python包,上传到TestPyPI做测试,目前有1.0.0、1.0.1、1.1.0三个版本。在新目录/项目中安装该包时,弹出如下依赖冲突错误:
ERROR: Cannot install my_package1.0.0, my_package1.0.1 and my_package==1.1.0 because these package versions have conflicting dependencies.
The conflict is caused by:
my_package 1.1.0 depends on pysqlite3
my_package 1.0.1 depends on flake8
my_package 1.0.0 depends on flake8To fix this you could try to:
- loosen the range of package versions you've specified
- remove package versions to allow pip attempt to solve the dependency conflict
但每次执行安装命令,错误提示里的依赖包名称都会变化!
我的setup.py部分代码如下:
python_requires=">=3.8, <4", packages=find_packages( include=["sqlalchemy_module"] ), install_requires=[ "requests", "pysqlite3", "SQLAlchemy", "logging", "argparse", "configparser", ], setup_requires=['setuptools'], # pip install -e flake8 ... ... extras_require={ "dev": ['flake8', 'black', 'isort', 'tox', 'mccabe', 'pre-commit', 'bumpver'] }, tests_require=["pytest", "pytest-cov"], package_data={}, package_dir={"": "."},
解决方法
1. 先解决当前安装问题:指定具体版本安装
错误提示同时出现三个版本,说明你执行的是pip install my_package这类未指定版本的命令,pip会尝试拉取所有可用版本解析依赖,但不同版本依赖不一致(1.1.0依赖pysqlite3,1.0.x依赖flake8),必然冲突。错误提示依赖包随机变,是因为pip每次尝试的版本组合顺序不同。
直接指定版本安装即可:
# 安装1.1.0版本 pip install my_package==1.1.0 # 或者安装1.0.x版本 pip install my_package==1.0.1
2. 从根源修复包的依赖问题
看你的setup.py代码,存在几个关键问题:
- 1.0.0/1.0.1版本误将开发依赖放入正式依赖:错误提示里1.0.x依赖flake8,但当前代码中flake8是在
extras_require["dev"]下的,说明你上传1.0.x版本时,误把flake8写到了install_requires里,导致用户安装正式包时需要开发依赖。 - install_requires包含Python标准库:
logging、argparse、configparser都是Python自带的标准库,不需要放到install_requires中,会增加不必要的依赖解析负担。 - 第三方依赖未做版本范围限制:如果你的包对
requests、SQLAlchemy这类第三方库没有严格版本要求,建议添加合理的版本范围,比如requests>=2.25.0,<3,避免后续出现依赖冲突。
3. 后续版本上传注意事项
- 上传新版本前,仔细检查
install_requires,确保只包含真正需要的第三方依赖,标准库不要加入。 - 开发依赖严格放在
extras_require["dev"]中,安装开发环境时用pip install my_package[dev]。 - 记录每个版本的依赖变更原因,避免无意义的依赖差异导致跨版本冲突。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

