如何通过Poetry钩子在package时用PyInstaller生成二进制可执行文件?
解决方案
一、修复builddist脚本配置无效问题
Poetry的scripts字段不支持直接写入完整Shell命令字符串,需改用以下两种方式之一:
方式1:数组形式指定命令(Poetry 1.2+ 支持)
修改pyproject.toml中的[tool.poetry.scripts]:
[tool.poetry.scripts] start = "main:start" builddist = ["poetry", "run", "pyinstaller", "main.py", "--collect-submodules", "application", "--onefile", "--name", "myapi"]
执行poetry run builddist即可触发PyInstaller构建。
方式2:Python包装函数
- 在项目根目录创建
build_scripts.py文件:
import subprocess def builddist(): subprocess.run( [ "pyinstaller", "main.py", "--collect-submodules", "application", "--onefile", "--name", "myapi" ], check=True, text=True )
- 修改
pyproject.toml的脚本配置:
[tool.poetry.scripts] start = "main:start" builddist = "build_scripts:builddist"
执行poetry run builddist即可完成构建。
二、让poetry package自动生成可执行文件
通过自定义Poetry构建钩子,在执行包构建前自动触发PyInstaller命令:
- 在项目根目录创建
build.py文件:
from poetry.core.masonry.builders.sdist import SdistBuilder from poetry.core.masonry.builders.wheel import WheelBuilder import subprocess def pre_build_hook(original_build): def wrapper(self, *args, **kwargs): # 执行PyInstaller构建 subprocess.run( [ "pyinstaller", "main.py", "--collect-submodules", "application", "--onefile", "--name", "myapi" ], check=True, text=True ) # 执行原有的构建逻辑 return original_build(self, *args, **kwargs) return wrapper # 为源码包和Wheel包构建注册前置钩子 SdistBuilder.build = pre_build_hook(SdistBuilder.build) WheelBuilder.build = pre_build_hook(WheelBuilder.build)
- 确保
pyproject.toml的构建系统配置不变:
[build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api"
现在执行poetry package时,会先自动生成PyInstaller可执行文件,再完成Python包的构建,产物均会输出到dist/目录下。
内容的提问来源于stack exchange,提问作者Rob Audenaerde
相关产品推荐
相关产品推荐

