使用PyOxidizer打包依赖Open3D的Python程序时运行报ModuleNotFoundError: no module named 'open3d.cpu'的问题排查
看起来你遇到了PyOxidizer打包Open3D时很典型的模块加载问题,我来帮你一步步排查解决。
首先得明确问题根源:Open3D的结构比较特殊,open3d.cpu是它依赖的平台特定子模块,PyOxidizer默认的资源检测逻辑可能没自动识别到这个模块,再加上你的配置里有一些可能干扰资源加载的设置,才导致运行时找不到它。
结合你给出的配置和警告信息,我整理了几个针对性的解决方案:
1. 修正重复的资源位置配置
你在代码里连续两次设置了policy.resources_location,第一次的"in-memory"会被第二次的"filesystem-relative:lib"覆盖,虽然最终的设置是适合Open3D的,但重复配置容易引发混淆,建议删掉冗余的那一行,只保留:
policy.resources_location = "filesystem-relative:lib"
2. 强制包含Open3D的所有子模块
PyOxidizer的自动依赖检测可能漏掉了open3d.cpu这个子模块,你可以手动指定要打包的模块来补全:
# 先通过pip安装Open3D exe.add_python_resources(exe.pip_install(["open3d==0.19.0"])) # 手动添加open3d.cpu子模块,确保被打包进去 exe.add_python_module("open3d.cpu")
如果还是不行,可以尝试直接打包整个Open3D包,确保所有组件都被包含:
exe.add_python_package("open3d")
3. 解决依赖版本不兼容的警告
打包时出现的numpy版本警告是因为你用的Python3.9不支持numpy 2.x,但Open3D 0.19.0是兼容Python3.9的,所以建议手动指定兼容的numpy版本,避免依赖解析出错:
exe.add_python_resources(exe.pip_install(["open3d==0.19.0", "numpy==1.26.4"]))
(numpy 1.26.4是支持Python3.9的最后几个稳定版本之一)
4. 调整模块路径的环境变量设置
你配置的python_config.write_modules_directory_env = "D:\\pythonProject\\tempData"会让程序运行时去指定的本地路径找模块,而不是打包后的内置路径,这很可能导致找不到打包好的open3d.cpu,建议注释掉这一行:
# python_config.write_modules_directory_env = "D:\\pythonProject\\tempData"
5. 验证打包结果
打包完成后,去生成的exe所在目录下的lib文件夹里检查,确认open3d目录下存在cpu相关的文件(比如.pyd动态库或者.py模块文件),如果没有,说明打包逻辑还是没正确包含,需要再调整配置。
按照这些步骤调整后,应该就能解决ModuleNotFoundError的问题了。
内容来源于stack exchange

