使用Nuitka编译Kivy程序报错:No module named 'kivy.weakmethod'
kivy._clock与kivy.weakmethod缺失问题 问题重现
尝试用Nuitka编译基于Kivy的Python程序,使用过以下命令:
nuitka --mingw64 --follow-imports Tivy3.py python -m nuitka --plugin-enable=kivy --standalone your_script.py
运行编译后的可执行文件时,出现错误:
[ERROR ] [Clock ] Unable to import kivy._clock. Have you perhaps forgotten to compile kivy? Kivy contains Cython code which needs to be compiled. A missing kivy._clock often indicates the Cython code has not been compiled. Please follow the installation instructions and make sure to compile Kivy
Traceback (most recent call last):
File "C:\Users\oliveira pc2\anaconda3\envs\nuitikavirtual\Tivy3.py", line 23, infrom kivy.app import App
File "C:\Users\oliveira pc2\anaconda3\envs\nuitikavirtual\lib\site-packages\kivy\app.py", line 417, infrom kivy.base import runTouchApp, async_runTouchApp , stopTouchApp
File "C:\Users\oliveira pc2\anaconda3\envs\nuitikavirtual\lib\site-packages\kivy\base.py", line 28, infrom kivy.clock import Clock
File "C:\Users\oliveira pc2\anaconda3\envs\nuitikavirtual\lib\site-packages\kivy\clock.py", line 466, infrom kivy._clock import CyClockBase, ClockEvent, FreeClockEvent,
File "kivy_clock.pyx", line 10, in init kivy._clock
ModuleNotFoundError: No module named 'kivy.weakmethod'
已完成操作:用Conda创建nuitikavirtual虚拟环境,安装Nuitka、Kivy及依赖,复制脚本到环境目录,问题仍存在。
解决方案
1. 先验证Kivy环境可用性
激活虚拟环境后,直接运行原脚本,确认Kivy本身能正常工作:
conda activate nuitikavirtual python Tivy3.py
如果这一步报错,先解决Kivy的安装问题(比如重新编译或安装Kivy),再进行编译操作。
2. 使用修正后的Nuitka编译命令
替换错误的脚本名,启用Kivy官方插件,并手动指定缺失的模块:
python -m nuitka --plugin-enable=kivy --standalone --mingw64 --include-module=kivy.weakmethod Tivy3.py
参数说明:
--plugin-enable=kivy:启用Nuitka的Kivy专用插件,自动处理Kivy的Cython编译依赖与资源打包--standalone:生成无需依赖Python环境的独立可执行文件--mingw64:指定使用MinGW编译器(适配Windows环境)--include-module=kivy.weakmethod:强制打包自动检测遗漏的kivy.weakmethod模块
3. 若问题仍存在,切换为pip安装Kivy
Conda打包的Kivy可能与Nuitka插件兼容性不佳,尝试用pip重新安装:
conda uninstall kivy pip install kivy[base]
重新运行上述编译命令。
4. 按需补充其他缺失模块
如果编译后仍有其他模块缺失,继续用--include-module=缺失模块名添加到命令中,比如后续出现kivy.xxx缺失,就追加对应参数。
内容的提问来源于stack exchange,提问作者Oliveira

