Nuitka和Kivy C扩展模块_event.so

问题描述

我正在尝试使用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行,在导入kivy中。_event没有名为_event的模块

模块 _event 实际上是Python解释器找到并加载OK的c扩展模块 _event.so

我的问题是-导致此错误的原因是什么?我可以解决这个问题吗?

看来Nuitka通常可以处理c个扩展模块,例如在{p}上做python -m nuitka --follow-imports

from bluetooth import bluez as _btz
print _btz._bt
print "Hello World!"
即使模块 bluez 具有指向 _bluetooth.so 扩展模块的import _bluetooth语句,

仍会生成可运行的可执行文件

./ hello.bin

Hello World!

在相关情况下:系统为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

以下是这里的线索 https://github.com/kivy/kivy/wiki/Packaging-Kivy-apps-written-in-Python-3,-targeting-Windows-using-Nuitka

创建dependencies.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

通过在Dependencies.py中添加相应的导入语句,可以纠正任何“ ImportError:没有名为<...>的模块”的情况。

但是,生成的可执行文件似乎并不比原始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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)