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

