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

如何在pyproject.toml中通过本地环境变量控制构建时的可选依赖?

在pyproject.toml中通过环境变量控制依赖安装的实现方法

pyproject.toml本身是静态配置文件,但可以通过两种方式实现类似setup.py的动态依赖控制,满足你根据环境变量和系统库存在情况调整依赖的需求:

方法一:使用setuptools环境变量标记(简单场景)

setuptools支持在pyproject.toml的依赖列表中直接使用环境变量标记,无需额外编写Python代码。直接在project.dependencies中添加带条件的依赖:

[project]
name = "your-package"
version = "0.1.0"
# 其他基础配置...
dependencies = [
    # 这里放你的常规依赖
    "requests>=2.25.0",
    # 仅当DO_NOT_INSTALL_THIS_PACKAGE环境变量不存在时,添加this_package依赖
    "this_package; os.environ.get('DO_NOT_INSTALL_THIS_PACKAGE') is None"
]

[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"

安装时,setuptools会自动解析这个条件:如果环境变量DO_NOT_INSTALL_THIS_PACKAGE未设置,就会安装this_package;反之则跳过。

方法二:动态构建逻辑(复杂场景)

如果需要结合系统库存在性检查等更复杂的判断,可以保留少量Python代码配合pyproject.toml实现:

步骤1:配置pyproject.toml启用动态依赖

在pyproject.toml中声明dependencies为动态字段,指定使用setuptools作为构建后端:

[project]
name = "your-package"
version = "0.1.0"
dynamic = ["dependencies"]

[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"

步骤2:编写setup.py实现动态逻辑

在项目根目录创建setup.py,写入原有的环境变量判断,再加入系统库检查逻辑:

import os
import ctypes
from setuptools import setup

def has_system_c_library():
    """检查系统是否已存在目标C库"""
    try:
        # 替换为你需要检查的C库文件名(比如libfoo.so、foo.dll)
        ctypes.CDLL("target_c_library.so")
        return True
    except OSError:
        return False

# 初始化固定依赖列表
install_requires = [
    "requests>=2.25.0"
]

# 逻辑判断:环境变量未设置,且系统无对应C库时,添加依赖
if not os.environ.get("DO_NOT_INSTALL_THIS_PACKAGE") and not has_system_c_library():
    install_requires.append("this_package")

setup(
    install_requires=install_requires
)

注意事项

  • 环境变量是在构建/安装阶段读取的,而非运行时;如果构建wheel包,构建时的环境变量会决定依赖是否被包含在wheel中,因此建议用源码分发(sdist)以适配不同环境。
  • 确保使用的setuptools版本≥61.0,否则可能不支持pyproject.toml的动态字段或环境变量标记语法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:05:12