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

适配pyproject.toml的Linux构建系统选型咨询(非PyPI项目)

推荐方案:Setuptools + 自定义构建命令

Setuptools是Python生态的标准构建工具,灵活度拉满,完全兼容pyproject.toml,能轻松实现系统包检查、自定义文件操作等需求,同时支持生成wheel包,完全匹配你的场景。

核心配置步骤

1. 编写pyproject.toml

在文件中指定构建依赖、项目依赖,同时添加自定义配置项(系统包列表、外部资源信息):

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

[project]
name = "your-project-name"
version = "0.1.0"
dependencies = [
    "numpy>=1.21",
    "scikit-learn>=1.0"
]

# 自定义配置:系统依赖与外部资源
[tool.your-project]
system-packages = ["gfortran", "libopenblas-dev", "liblapack-dev"]
external-archives = [
    { url = "https://example.com/your-archive.tar.gz", dest = "src/your_project/external", extract = true }
]

2. 实现自定义构建逻辑(setup.py)

创建setup.py,通过继承setuptools.Command实现前置构建操作:

import os
import subprocess
import tarfile
from setuptools import setup, Command
from setuptools.config import read_configuration

class PrepareBuild(Command):
    description = "检查系统依赖、下载外部资源"
    user_options = []

    def initialize_options(self):
        pass

    def finalize_options(self):
        self.config = read_configuration("pyproject.toml")["tool"]["your-project"]

    def run(self):
        # 检查Debian系系统包
        system_pkgs = self.config["system-packages"]
        if system_pkgs:
            print(f"检查系统依赖:{', '.join(system_pkgs)}")
            result = subprocess.run(
                ["dpkg", "-l"] + system_pkgs,
                capture_output=True,
                text=True
            )
            if result.returncode != 0:
                missing = [pkg for pkg in system_pkgs if pkg not in result.stdout]
                raise RuntimeError(
                    f"缺少依赖包:{', '.join(missing)},请执行:sudo apt-get install {' '.join(missing)}"
                )

        # 下载并解压外部归档
        for archive in self.config["external-archives"]:
            url = archive["url"]
            dest_dir = archive["dest"]
            extract = archive.get("extract", False)
            os.makedirs(dest_dir, exist_ok=True)
            archive_path = os.path.join(dest_dir, os.path.basename(url))

            print(f"下载资源:{url} -> {archive_path}")
            subprocess.run(["curl", "-o", archive_path, url], check=True)

            if extract:
                print(f"解压归档:{archive_path} -> {dest_dir}")
                with tarfile.open(archive_path, "r:*") as tar:
                    tar.extractall(path=dest_dir)
                os.remove(archive_path)

setup(
    cmdclass={
        "prepare_build": PrepareBuild,
    }
)

3. 执行构建流程

  • 先运行前置准备命令:python setup.py prepare_build
  • 生成wheel包:python -m build --wheel
  • 安装项目:pip install .

备选方案:Hatch

如果觉得Setuptools的自定义命令稍显繁琐,可以用Hatch。它支持在pyproject.toml中定义构建钩子,执行前置操作,同样能生成wheel包。

核心配置示例

[build-system]
requires = ["hatchling>=1.10"]
build-backend = "hatchling.build"

[project]
name = "your-project-name"
version = "0.1.0"
dependencies = ["numpy>=1.21", "scikit-learn>=1.0"]

[tool.hatch.build.hooks.custom]
script = "scripts/build_prep.py"

# 自定义配置项
[tool.your-project]
system-packages = ["gfortran", "libopenblas-dev"]
external-archives = [{ url = "https://example.com/archive.tar.gz", dest = "src/external" }]

然后编写scripts/build_prep.py脚本,实现和Setuptools方案中一致的系统包检查、资源下载逻辑即可。

排除其他工具的原因

  • Poetry:优先避免,且它核心定位是依赖管理与PyPI发布,自定义构建灵活性不足,没必要强行使用。
  • PDM:侧重依赖管理,自定义构建能力不如Setuptools,对于你的简单需求来说过重。
  • Flit:功能简洁,但不支持复杂的自定义构建操作,无法满足系统包检查、外部资源下载的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 15:07:27