我正在尝试使用 Nuitka 从这个基本的 Kivy 示例 hello.py 创建一个独立的可执行文件:
from kivy.app import App
from kivy.uix.button import Button
class TestApp(App):
def build(self):
return Button(text='Hello World')
TestApp().run()
当我这样做时python -m nuitka --follow-imports hello.py
,Nuitka 会创建可执行文件,但是当我运行它时,它会失败并显示
../dist-packages/kivy/event.py",第 8 行,在 import kivy._event 中没有名为 _event 的模块
_event模块实际上是Python 解释器找到并正常加载的 c 扩展模块_event.so 。
我的问题是 - 是什么导致了这个错误?我可以解决这个问题吗?
似乎 Nuitka 通常可以处理 c 扩展模块,例如python -m nuitka --follow-imports
在
from bluetooth import bluez as _btz
print _btz._bt
print "Hello World!"
即使模块bluez有一个引用_bluetooth.so扩展模块的import _bluetooth
语句,也会产生一个正常运行的可执行文件:
./hello.bin
<来自'/usr/lib/python2.7/dist-packages/bluetooth/_bluetooth.so'的模块'bluetooth._bluetooth'>
你好世界!
如果相关:系统是 MX Linux 18.3(基于 Debian Stretch)、Python 2.7.13、Kivy v1.10.1、Nuitka 0.6.8.4
我的目标是加快 Kivy 应用程序的启动时间,而不是打包应用程序以进行分发。例如,我有一个 RPI2B 嵌入式系统,在 Buildroot 生成的 Linux 上运行 Kivy 应用程序。这次冷启动需要 12 秒,其中 6 秒是 Kivy 应用启动时间。因此,例如 PyInstaller 在这里对我没有帮助,而 Nuitka 可能可以。
更新
我放弃了尝试让它与 Python 2.7 一起工作,不确定发生了什么,但我遇到了一些 Nuitka 无限优化循环问题。使用 Python 3.5 更进一步,这些是我做这件事时的笔记:
sudo apt-get update
sudo apt-get install python3-pip
sudo apt-get install python3-setuptools
sudo apt-get install python3-dev
sudo apt-get install mesa-common-dev
sudo apt install libgl1-mesa-dev
sudo apt-get install chrpath
pip3 install wheel
pip3 install pygame
pip3 install kivy (ended up with 1.11.1)
pip3 install nuitka
创建依赖项.py:
# external modules
import kivy.cache
import kivy.atlas
import kivy.network
import kivy.network.urlrequest
#import kivy.lib.osc
#import kivy.lib.osc.OSC
#import kivy.lib.osc.oscAPI
import kivy.lib.mtdev
#import kivy.lib.sdl2
import kivy.factory_registers
import kivy.input.recorder
import kivy.input.providers
import kivy.input.providers.tuio
import kivy.input.providers.mouse
#import kivy.input.providers.wm_common
#import kivy.input.providers.wm_touch
#import kivy.input.providers.wm_pen
import kivy.input.providers.hidinput
import kivy.input.providers.linuxwacom
#import kivy.input.providers.mactouch
import kivy.input.providers.mtdev
# compiled modules
import kivy.event
import kivy.graphics.buffer
#import kivy.graphics.c_opengl_debug
import kivy.graphics.compiler
import kivy.graphics.context_instructions
import kivy.graphics.fbo
import kivy.graphics.instructions
import kivy.graphics.opengl
import kivy.graphics.opengl_utils
import kivy.graphics.shader
#import kivy.graphics.stenctil_instructions
import kivy.graphics.texture
import kivy.graphics.transformation
import kivy.graphics.vbo
import kivy.graphics.vertex
import kivy.graphics.vertex_instructions
import kivy.graphics.tesselator
import kivy.graphics.svg
import kivy.properties
import kivy.graphics.cgl_backend
# core
# import kivy.core.audio.audio_gstplayer
# import kivy.core.audio.audio_pygst
import kivy.core.audio.audio_sdl2
# import kivy.core.audio.audio_pygame
# import kivy.core.camera.camera_avfoundation
# import kivy.core.camera.camera_pygst
# import kivy.core.camera.camera_opencv
# import kivy.core.camera.camera_videocapture
import kivy.core.clipboard.clipboard_sdl2
# import kivy.core.clipboard.clipboard_android
# import kivy.core.clipboard.clipboard_pygame
# import kivy.core.clipboard.clipboard_dummy
# import kivy.core.image.img_imageio
# import kivy.core.image.img_tex
# import kivy.core.image.img_dds
import kivy.core.image.img_sdl2
# import kivy.core.image.img_pygame
# import kivy.core.image.img_pil
# import kivy.core.image.img_gif
# import kivy.core.spelling.spelling_enchant
# import kivy.core.spelling.spelling_osxappkit
import kivy.core.text.text_sdl2
# import kivy.core.text.text_pygame
# import kivy.core.text.text_sdlttf
# import kivy.core.text.text_pil
# import kivy.core.video.video_gstplayer
# import kivy.core.video.video_pygst
# import kivy.core.video.video_ffmpeg
# import kivy.core.video.video_pyglet
# import kivy.core.video.video_null
import kivy.core.window.window_info
import kivy.graphics.cgl_backend.cgl_glew
import kivy.graphics.cgl_backend.cgl_gl
import kivy.graphics.cgl_backend.cgl_sdl2
import kivy.core.window.window_sdl2
#import kivy.core.window.window_egl_rpi
# import kivy.core.window.window_pygame
# import kivy.core.window.window_sdl
# import kivy.core.window.window_x11
像这样使用它:
python3 -m nuitka --include-plugin-files=dependencies.py --standalone hello.py
cp -r <path/to>/lib/python3.5/site-packages/kivy/data <path/to>/hello.dist/kivy/
./hello.dist/hello
任何“ImportError: No module named <...>”都可以通过在 dependencies.py 中添加相应的导入语句来解决
然而,生成的可执行文件似乎并不比原始 python 脚本快。而且它不会在同一台机器上的单独 MX Linux 实例下运行,我得到了这个:
X Error of failed request: BadValue (integer parameter out of range for operation)
Major opcode of failed request: 155 (GLX)
Minor opcode of failed request: 3 (X_GLXCreateContext)
Value in failed request: 0x0
Serial number of failed request: 72
Current serial number in output stream: 73