You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为bdist wheel固定依赖版本同时保留开发安装的非固定依赖

Python项目区分wheel分发依赖与开发版依赖的解决方案

你可以直接在setup.py中通过判断当前执行的命令类型,动态设置install_requires的值,完全不需要用户手动执行多步命令,方案实现如下:

实现逻辑

核心思路是检测当前运行环境是否为wheel构建场景:

  • 如果是构建bdist wheel的场景,就使用带固定版本号的依赖列表,保证终端用户安装wheel时的依赖版本符合预期
  • 如果是普通安装/可编辑安装(开发场景),就使用不固定版本的依赖列表,自动拉取最新版本做兼容性测试

代码示例

修改你的setup.py代码如下:

import sys
from setuptools import setup

# 定义两类依赖:固定版本供wheel分发使用,不固定版本供开发场景使用
pinned_dependencies = [
    "numpy==1.20.0",
    "scipy==1.7.3",
    "matplotlib==3.4.3"
]
unpinned_dependencies = [
    "numpy",
    "scipy",
    "matplotlib"
]

# 判断是否处于wheel构建场景
is_wheel_build = "bdist_wheel" in sys.argv

setup(
    # 其他原有配置项保持不变
    install_requires=pinned_dependencies if is_wheel_build else unpinned_dependencies,
)

验证方法

  1. 构建wheel时执行原有命令pip wheel . --no-deps即可,生成的wheel包内METADATA文件会自动携带固定版本的依赖声明,终端用户安装时会拉取对应版本的依赖
  2. 开发场景执行pip install -e .时,会自动使用不固定版本的依赖列表,拉取各依赖的最新版本,满足兼容性测试需求

增强兼容方案

如果担心存在特殊构建场景没有命中bdist_wheel参数的判断,可以额外增加环境变量判断逻辑,修改判断部分代码如下:

import os
import sys

is_wheel_build = "bdist_wheel" in sys.argv or os.getenv("PROJECT_BUILD_WHEEL") == "1"

你自己构建wheel时执行PROJECT_BUILD_WHEEL=1 pip wheel . --no-deps即可,进一步降低误判概率。

内容的提问来源于stack exchange,提问作者Sean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 08:06:04