Nuitka将PYD文件集成到PY脚本与EXE程序的导入及编译问题咨询
解决方案
1 修复PySimpleGUI.pyd导入错误
你出现导入报错的核心原因是导入语句多余添加了.pyd后缀:Python导入模块时会自动识别.pyd/.py/.pyc等后缀,不需要手动指定。
修改导入语句为以下内容即可:
import PySimpleGUI as sg
搭配你已添加的路径配置即可正常加载同目录或DLL子目录下的pyd文件。如果需要避免相对路径受工作目录影响,可以替换路径配置为绝对路径写法:
import sys import os # 自动获取exe所在目录的绝对路径,拼接DLL子目录 sys.path.append(os.path.join(os.path.dirname(os.path.abspath(sys.executable)), "DLL"))
2 编译dateutil.relativedelta这类子依赖为.pyd文件
dateutil.relativedelta属于包下的子模块,不存在独立单文件只是你没有找到对应路径,有两种编译方案可选:
方案A 编译整个第三方包
直接编译整个依赖包,Nuitka会自动处理包内的结构和子模块依赖,编译后导入写法和原生完全一致。以dateutil为例,编译命令如下:
python -m nuitka --module --include-package=dateutil --output-dir=./DLL dateutil
编译完成后DLL目录下会生成完整的dateutil编译后结构,所有子模块都会转换为.pyd格式,直接执行from dateutil.relativedelta import relativedelta即可正常调用。
方案B 仅编译用到的子模块
如果不需要编译整个包,仅编译用到的子模块即可:
- 找到子模块对应的源文件路径,例如dateutil.relativedelta对应的源文件为
site-packages/dateutil/relativedelta.py,同时还要编译dateutil包的__init__.py - 分别执行编译命令:
# 编译包的__init__.py python -m nuitka --module "C:\Program Files\Python\Lib\site-packages\dateutil\__init__.py" --output-dir=./DLL/dateutil # 编译relativedelta子模块 python -m nuitka --module "C:\Program Files\Python\Lib\site-packages\dateutil\relativedelta.py" --output-dir=./DLL/dateutil
编译完成后即可正常导入子模块。
3 更简化的全编译流程
无需手动逐个编译依赖,调整主程序编译参数即可让Nuitka自动把所有依赖都转换为.pyd格式,统一存放到指定目录,不需要手动处理路径配置:
python -m nuitka --standalone --plugin-enable=tk-inter --plugin-enable=numpy --mingw64 --output-dir=X: --package-directory=DLL --prefer-source-code app.py
该命令会自动将所有依赖编译为.pyd并存放在exe所在目录的DLL子目录下,自动处理导入路径,不需要你手动修改sys.path,也不会出现未编译的.py文件。
注意:编译依赖pyd和编译主程序必须使用相同的Python环境、Nuitka版本、编译器,否则会出现兼容性问题导致导入失败。
内容的提问来源于stack exchange,提问作者User68325794
相关产品推荐
相关产品推荐

