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

Python Wheel构建时如何避免在项目目录生成构建文件,现代处理方式是什么?

Python Wheel构建时如何避免在项目目录生成构建文件,现代处理方式是什么?

兄弟,我太懂你之前折腾自定义setup.py命令却完全不管用的憋屈了——现在Python的构建体系早就换成PEP 517/518那套标准了,旧的setup.py命令钩子在现代构建流程里根本不生效,白忙活半天太正常了。我给你说几个实用的现代解法,不用绕得太复杂:

  • 动态生成临时输出目录(最直接,不用改任何配置)
    你说没法用--outdir是因为需要动态生成目录?其实完全可以在命令行里直接用shell的动态目录生成命令,直接嵌在build命令里就行:
    比如在Linux或macOS下,用mktemp -d自动生成临时目录:

    python -m build --wheel --outdir $(mktemp -d)
    

    Windows PowerShell下可以这么写:

    python -m build --wheel --outdir $(New-TemporaryFile).DirectoryName
    

    这样每次构建都会自动生成一个全新的临时目录,完全不会污染你的项目目录,也不用提前手动创建或者写复杂的脚本绕开build工具。

  • 自定义构建后端(适合深度定制构建逻辑)
    如果你的构建流程特别复杂,比如需要在生成目录时做额外的校验或者和其他工具联动,那可以写一个简单的自定义构建后端,继承setuptools的默认后端,重写构建方法来指定输出目录。比如在项目里创建一个build_backend.py文件:

    from setuptools.build_meta import *
    import tempfile
    import shutil
    import os
    
    def build_wheel(wheel_directory, config_settings=None, metadata_directory=None):
        # 这里可以按你的需求动态生成目录,比如用临时目录或者自定义规则
        with tempfile.TemporaryDirectory() as tmp_dir:
            # 调用默认的build_wheel逻辑,输出到我们指定的目录
            wheel_file = super().build_wheel(tmp_dir, config_settings, metadata_directory)
            # 如果需要把生成的wheel移到你最终想要的位置,这里可以加移动逻辑
            # 比如 shutil.move(os.path.join(tmp_dir, wheel_file), "/your/target/path")
            return wheel_file
    

    然后在pyproject.toml里指定这个自定义后端:

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

    这个方法适合需要完全掌控构建流程的场景,一般情况下用第一个命令行的方法就够了。

最后再给你补个知识点:为什么你之前的setup.py自定义命令不管用?因为现在用python -m build时,走的是PEP 517的隔离构建流程,build工具会直接调用构建后端的标准接口,完全绕开了旧的setup.py里的命令钩子,所以你之前写的那些自定义bdist_wheel、build命令自然就被忽略了。

备注:内容来源于stack exchange,提问作者squashed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:08:07