Blender 官方 bpy 的 PyPI 发布流程:从构建触发到 twine 上传的完整指南

发布时间:2026/9/20 20:32:57
Blender 官方 bpy 的 PyPI 发布流程:从构建触发到 twine 上传的完整指南 Blender 官方 bpy 的 PyPI 发布流程从构建触发到 twine 上传的完整指南【免费下载链接】blenderOfficial mirror of Blender项目地址: https://gitcode.com/gh_mirrors/bl/blender本篇技术指南以 Blender 仓库中 release/pypi/README.md 为核心系统讲解官方如何把「Blender 作为 Python 模块」的bpy包发布到 PyPI 的全过程从环境准备、~/.pypirc凭据配置、BuildBot 构建触发到upload-release.py的多平台 wheel 下载校验与上传。读完本文你将掌握 bpy 官方发布管线的每一步操作、底层脚本实现以及对应的构建与测试依据可直接在仓库中复现核对。bpy 是什么一个可直接import的 Blenderbpy是 Blender 以 Python 模块形式发布的产物用于工作室流程、Web 服务、科学研究等无界面场景。在 build_files/utils/make_bpy_wheel.py 中定义的包长描述明确写道该包provides Blender as a Python module for use in studio pipelines, web services, scientific research, and more且与 Blender 桌面版共享相同的系统要求requirements 与 Blender 一致每个 Blender 版本只支持一个特定的 Python 版本因此 wheel 与 Python 版本严格绑定。发布包的核心构建开关位于 build_files/cmake/config/bpy_module.cmake其中WITH_PYTHON_MODULE ON是打包的前提条件同时还针对模块场景做了大量裁剪禁用音频设备占用WITH_JACK、WITH_OPENAL、WITH_SDL_AUDIO、WITH_PULSEAUDIO、WITH_WASAPI、WITH_COREAUDIO均 OFF仅保留WITH_AUDASPACE以支持序列化器在 Python 中正常工作、禁用 3D 鼠标输入WITH_INPUT_NDOFOFF、禁用国际语言支持WITH_INTERNATIONALOFF等目标是让模块快速加载且不占用音频设备。发布前置安装 Twine 与配置 PyPI 凭据1. 安装 Twine官方发布流程的第一步是安装上传工具 Twinepip3 install twineTwine 是 Python 生态中向 PyPI 上传分发包的标准工具负责 wheel 的签名校验、上传与结果验证。upload-release.py脚本在最后阶段会直接调用twine check和twine upload见下文因此这是硬性依赖。2. 创建~/.pypirc凭据文件在用户主目录创建~/.pypirc内容如下Token 与发布所用的其他凭据存放在同一处[distutils] index-servers pypi bpy [pypi] username __token__ password SECRET_PYPI_TOKEN [bpy] repository https://upload.pypi.org/legacy/ username __token__ password SECRET_PYPI_TOKEN配置要点[distutils]段的index-servers声明了两个可用的上传目标pypi默认官方源与bpy显式指定上传仓库用户名统一使用__token__密码为 PyPI 提供的 API Token——这是 PyPI 推荐的现代认证方式避免在命令行暴露真实账号密码[bpy]段显式写明了repository https://upload.pypi.org/legacy/这正是upload-release.py中twine upload --repository bpy所指向的上传端点。触发发布构建BuildBot 与 Git Hash 核对官方发布的第一个动作并非本地打包而是触发 BuildBot 构建要求构建任务同时启用Python Module与Package Delivery两项配置。也就是说最终上传的 wheel 由官方 CI 集群产出而非发布者本机构建。构建产出后务必在下载页面核对 Git hash。这一步对应 release/pypi/upload-release.py 中的下载逻辑脚本按版本号拼出短版本号version_tokens[0] version_tokens[1]例如3.6.0→36再结合传入的--git-hash构造出如下格式的下载 URLhttps://builder.blender.org/download/daily/bpy-{version}-stablev{short_version}.{git_hash}-{platform}-release.zip例如对3.6.0与abcd1234https://builder.blender.org/download/daily/bpy-3.6.0-stablev36.abcd1234-darwin.x86_64-release.zip脚本内置了四个目标平台平台标识说明darwin.x86_64macOS Inteldarwin.arm64macOS Apple Siliconlinux.x86_64Linux x86_64windows.amd64Windows x64每个平台的 zip 包被下载到临时目录并解压随后通过glob收集其中的*.whl文件。如果最终 wheel 数量不等于平台数量4脚本会向stderr输出 Unexpected number of whl files. 并以退出码 1 终止——这是发布流程的第一道自动化防线防止平台缺失或产物异常时仍继续上传。执行发布check 与 upload 两步走检查不上传先以--check模式运行仅校验 wheel 而不上传./upload-release.py --version X.X.X --git-hash abcd1234 --check对应源码 release/pypi/upload-release.py 的逻辑subprocess.run([twine, check] wheels, checkTrue) if not args.check: subprocess.run([twine, upload, --repository, bpy, --verbose] wheels, checkTrue)twine check会验证每个 wheel 的元数据完整性与长描述long_description能否被 PyPI 正确渲染任何错误都会使命令以非零状态退出从而中断流程。上传正式发布检查通过后去掉--check参数即可真正发布./upload-release.py --version X.X.X --git-hash abcd1234脚本会以--repository bpy和--verbose调用twine upload将所有 4 个平台的 wheel 一次性上传到~/.pypirc中[bpy]段指定的https://upload.pypi.org/legacy/仓库。命令行参数速查参数必填说明--version是形如{major}.{minor}.{patch}的版本号如3.6.0用于拼出下载 URL 的短版本段--git-hash是与版本匹配的 Git 提交哈希同样用于 URL 构造--check否仅下载并twine check不执行上传深入脚本实现upload-release.py 的执行链release/pypi/upload-release.py 全流程可以概括为五个阶段参数解析argparse强制要求--version与--git-hash并行下载对四个平台逐个urllib.request.urlretrieve下载 zip 包到tempfile.TemporaryDirectory()临时目录并解压wheel 收集与校验glob找出全部*.whl打印路径清单并用len(platforms) ! len(wheels)做数量断言twine check无论是否上传都会先执行元数据校验checkTrue保证失败即终止twine upload仅当未指定--check时执行向bpy仓库上传。值得注意的实现细节脚本使用tempfile.TemporaryDirectory()管理全部中间产物发布过程不污染工作目录下载阶段把 URL 逐条打印到控制台方便发布者核对版本与 hash 是否匹配。wheel 是如何打出来的make_bpy_wheel.py 与平台标签官方 BuildBot 产出的 wheel 由 build_files/utils/make_bpy_wheel.py 打包生成理解它能帮你核对发布产物的正确性构建前提Blender 必须以WITH_PYTHON_MODULE启用状态构建如make bpy lite然后执行./build_files/utils/make_bpy_wheel.py ../build_linux_bpy_lite/bin --output-dir./Python 版本标签脚本从CMakeCache.txt读取PYTHON_VERSION手动构造python_tagpyXY与cpython_tagcpXY而不是沿用运行脚本的系统 Python 标签——因为打包机 Python 与 Blender 内嵌 Python 往往不一致平台标签按sys.platform区分——macOS 用macosx_{major}_0_{arch}minor 恒为 0遵循 packaging 规范Windows 用win_{machine}并对 Windows-on-ARM 的虚拟化环境做特殊处理依据PROCESSOR_IDENTIFIER中的ARM判断Linux 则读取 glibc 版本生成manylinux_{glibc}_{machine}标签二进制标识通过自定义BinaryDistribution.has_ext_modules()返回True强制 wheel 标记为平台特定包而非纯 Python 包依赖声明install_requires[cattrs, cython, numpy2.2,3.0, requests, zstandard]python_requires严格限定X.Y.*版本号直接取自make_utils.parse_blender_version()与 Blender 自身版本保持一致。关于已归档版本PyPI 上会移除当前 LTS 窗口之外的旧版本但它们仍可通过 Blender 官方归档源安装例如pip install bpy3.6.0 --extra-index-url https://download.blender.org/pypi/发布后的可运行性验证import_bpy 测试仓库在 tests/blender_as_python_module/import_bpy.py 提供了与发布质量直接相关的冒烟测试它把模块目录加入sys.path后直接import bpy用于捕获动态加载错误随后调用bpy.utils.expose_bundled_modules()并依次导入pxr.Usd、MaterialX、OpenImageIO、PyOpenColorIO以及pyopenvdb/openvdb、oslquery等随包捆绑库。这组测试验证了 wheel 内嵌依赖的可用性也解释了 PyPI 包描述中 the package is only compatible with that version [of Python] 的约束来源——bpy 与 Python 版本、平台架构强绑定发布时四平台 wheel 缺一不可。发布流程总结完整的官方 bpy 发布可以归纳为四条命令、一次核对一次性准备pip3 install twine 写入~/.pypirc含[bpy]仓库段与__token__凭据在 BuildBot 上触发启用Python Module与Package Delivery的构建并在下载页核对 Git hash校验./upload-release.py --version X.X.X --git-hash abcd1234 --check下载 4 平台 wheel 并twine check发布./upload-release.py --version X.X.X --git-hash abcd1234twine upload --repository bpy。整个过程由 release/pypi/upload-release.py 全自动串联人为干预点仅剩版本号与 Git hash 的确认——这正是官方发布管线构建产物 CI 化、上传动作脚本化的设计思路。若需深入可继续阅读 build_files/utils/make_bpy_wheel.pywheel 生成、build_files/cmake/config/bpy_module.cmake模块裁剪配置与 tests/blender_as_python_module/import_bpy.py可运行性验证。【免费下载链接】blenderOfficial mirror of Blender项目地址: https://gitcode.com/gh_mirrors/bl/blender创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考