使用cx_Freeze打包含scikit-build编译C扩展的脚本时模块缺失问题
解决cx_Freeze打包scikit-build编译的C扩展缺失问题
问题根源
cx_Freeze的自动依赖检测只能识别纯Python模块,你通过scikit-build编译生成的二进制C扩展_atscManufacturing无法被自动识别,因此被归入Missing modules列表,导致运行时找不到依赖直接退出。
解决步骤
无需重新编译C扩展,只需手动将已编译好的扩展文件加入cx_Freeze的打包配置即可,操作如下:
1. 定位已编译的C扩展文件
首先找到_atscManufacturing的二进制文件,不同系统后缀不同:
- Windows系统后缀为
.pyd - Linux/macOS系统后缀为
.so
该文件一般存放在Python环境的site-packages/atsc/atscManufacturing/目录下,复制该文件的绝对路径备用。
2. 修改主程序的setup.py配置
调整cx_Freeze的build_exe_options参数,新增includes声明缺失的模块,新增include_files将已编译的二进制文件拷贝到打包后的对应目录,修改后完整代码如下:
from cx_Freeze import setup, Executable # 替换为你第一步获取的_atscManufacturing二进制文件实际绝对路径 EXTENSION_FILE_PATH = "你的扩展文件实际路径,例如:C:/Python310/Lib/site-packages/atsc/atscManufacturing/_atscManufacturing.cp310-win_amd64.pyd" build_exe_options = { # 原有包配置,这里把层级改到atsc根包即可,无需写到底层模块 "packages": ["os", "atsc", "intelhex", "logging", "atexit", "sys"], # 手动添加无法被自动检测的C扩展模块 "includes": ["_atscManufacturing"], # 配置文件拷贝规则:(源文件路径, 打包后存放的目标目录) "include_files": [ (EXTENSION_FILE_PATH, "atsc/atscManufacturing/") ], "excludes": [] } base = None setup( name = "Manufacturing script", version = "1.0.0", description = "manufacturing script", options = {"build_exe": build_exe_options}, executables = [Executable("main.py", base = base)] )
3. 验证打包结果
重新执行打包命令,打包完成后打开build输出目录,进入lib/atsc/atscManufacturing/路径,确认_atscManufacturing的二进制文件存在即可。
额外排查技巧
如果运行exe仍然闪退,可直接在命令行中启动exe,就能看到具体报错信息,方便定位路径配置等问题。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

