当前位置: 首页 > 面试题库 >

Kivy:编译为单个可执行文件

萧英睿
2023-03-14
问题内容

在kivy论坛中没有得到回应,因此请在这里尝试。

当我将教程pong代码编译为一个文件可执行文件时,我仍然必须将pong.kv文件包含在同一文件夹中才能运行。否则,启动exe时出现以下错误:

    GL:支持EXT_framebuffer_object
    [INFO] [GL] OpenGL版本 
    [INFO] [GL] OpenGL供应商 
    [INFO] [GL] OpenGL渲染器 
    [INFO] [GL] OpenGL解析的版本:2、1
    [INFO] [GL]底纹版本 
    [INFO] [GL]纹理最大尺寸 
    [INFO] [GL]纹理最大单位 
    [信息] [窗口]自动添加sdl2输入提供程序
    [INFO] [Window]虚拟键盘不允许,
    单模,不对接
     追溯(最近一次通话):
       在第81行的文件“”中 
       文件“ c:\ python34 \ lib \ site-packages \ kivy \ app.py”,第802行,位于
    跑
         根= self.build()
       文件“”,第75行,在构建中
       在serveBall中的文件“”,第20行
     AttributeError:“ NoneType”对象没有属性“ center”
    主要返回-1

如何使它作为一个可执行文件运行。这是我的pong.spec文件:

    # -*- mode: python -*-

    from kivy.deps import sdl2, glew

    block_cipher = None


    a = Analysis(['Code\main.py'],
                 pathex=['E:\\Development\\Pong'],
                 binaries=None,
                 datas=None,
                 hiddenimports=[],
                 hookspath=[],
                 runtime_hooks=[],
                 excludes=[],
                 win_no_prefer_redirects=False,
                 win_private_assemblies=False,
                 cipher=block_cipher)
    pyz = PYZ(a.pure, a.zipped_data,
                 cipher=block_cipher)

    a.datas += [('Code\pong.kv', 'E:\\Development\\Pong\Code\pong.kv', 'DATA')]

    exe = EXE(pyz,Tree('Code'),
              a.scripts,
              a.binaries,
              a.zipfiles,
              a.datas,
              *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
              name='pong',
              debug=False,
              strip=False,
              upx=True,
              console=True , icon='pong.ico')

请注意,我尝试将pong.kv包括在数据列表中,但这没有帮助。

谢谢,-Raj


问题答案:

根据KeyWeeUsr提供的链接(将数据文件与PyInstaller捆绑在一起,并使用PyInstaller从Python脚本制作EXE)并将其与Kivy的资源路径方法结合起来,这是一个可行的解决方案。我觉得这有点麻烦,因为它使用SYS._MEIPASS(我希望使用公共API),并且需要在您的Python代码中添加代码段。但是,该解决方案可以在Windows和Mac上运行,因此可以共享。

假设我具有以下代码层次结构:

MyCode /
    MyApp.py(这是主程序)
    myapp.kv(这是关联的kv文件)

    MyData /(这是应用程序使用的数据所在的位置)
       myapp.icns(例如Mac的图标文件)
       myapp.ico(例如Windows的图标文件)

建立/
    苹果电脑/ 
        myapp.spec(在Mac平台上构建的spec文件)
    电脑/ 
        myapp.spec(在Windows平台上构建的规范文件)

MyHiddenImports /(包含用于隐藏导入的python文件的文件夹)

我在示例中添加了MyHiddenImports文件夹,以防您的代码在运行时还将包含python代码的另一个文件夹附加到sys.path中。

在MyApp.py中添加以下内容:

def resourcePath():
    '''Returns path containing content - either locally or in pyinstaller tmp file'''
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS)

    return os.path.join(os.path.abspath("."))

if __name__ == '__main__':
    kivy.resources.resource_add_path(resourcePath()) # add this line
    my_app = MyApp()

resources_add_path()告诉Kivy在哪里寻找data / .kv文件。例如,在Mac上,运行pyinstaller应用程序时,它指向/
private / var / folders / 80 / y766cxq10fb_794019j7qgnh0000gn / T /
_MEI25602,在Windows中,它指向c:\ users \ raj \ AppData \ Local \
Temp_MEI64zTut(这些文件夹会在退出应用后被删除,并在再次启动时创建另一个名称)。


我使用以下命令创建了初始Mac模板规范文件:

pyinstaller –onefile -y –clean –windowed –name myapp –icon = .. / .. /
Code / Data / myapp.icns –exclude-module _tkinter –exclude-module Tkinter
–exclude-module附魔–exclude-module扭曲../../Code/MyApp.py

这是修改后的Mac OS Spec文件:

# -*- mode: python -*-

block_cipher = None


a = Analysis(['../../Code/MyApp.py'],
            pathex=['/Users/raj/Development/Build/mac', 
            '../../MyHiddenImports'],    
            binaries=None,
            datas=None,
            hiddenimports=['MyHiddenImports'],    
            hookspath=[],
            runtime_hooks=[],
            excludes=['_tkinter', 'Tkinter', 'enchant', 'twisted'],
            win_no_prefer_redirects=False,
            win_private_assemblies=False,
            cipher=block_cipher)

pyz = PYZ(a.pure, a.zipped_data,
            cipher=block_cipher)

a.datas += [('myapp.kv', '../../MyCode/my.kv', 'DATA')]

exe = EXE(pyz, Tree('../../Code/Data', 'Data'), 
            a.scripts,
            a.binaries,
            a.zipfiles,
            a.datas,
            name='myapp',
            debug=False,
            strip=False,
            upx=True,
            console=False , icon='../../Code/Data/myapp.icns')

app = BUNDLE(exe,
             name='myapp.app',
             icon='../../Code/Data/myapp.icns',
             bundle_identifier=None)

注意事项:我将隐藏导入路径添加到pathex,并在hiddenimports中引用了该包。我将myapp.kv文件附加到a.datas,因此它将被复制到应用程序中。在EXE中,我添加了数据树。我包括了prefix参数,因为我希望将Data文件夹复制到应用程序中(而不是让孩子坐在根目录下)。

要编译代码以创建应用程序并将其放入dmg文件中,我有一个make-myapp脚本,该脚本执行以下操作:

pyinstaller -y --clean --windowed myapp.spec
推dist
hdiutil create ./myapp.dmg -srcfolder myapp.app -ov
弹出
cp ./dist/myapp.dmg。

同样,这是Windows规格文件:

# -*- mode: python -*-

from kivy.deps import sdl2, glew

block_cipher = None


a = Analysis(['..\\..\\Code\\Cobbler.py'],
             pathex=['E:\\Development\\MyApp\\Build\\pc',
             '..\\..\\MyHiddenImports'],
             binaries=None,
             datas=None,
             hiddenimports=['MyHiddenImports'],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)

pyz = PYZ(a.pure, a.zipped_data,
         cipher=block_cipher)

a.datas += [('myapp.kv', '../../Code/myapp.kv', 'DATA')]

exe = EXE(pyz, Tree('..\\..\\Code\\Data','Data'),
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
          name='myapp',
          debug=False,
          strip=False,
          upx=True,
          console=False, icon='..\\..\\Code\\Data\\myapp.ico' )

并编译Windows应用程序:

python -m PyInstaller myapp.spec



 类似资料:
  • 以下是我的cmake代码: 我尝试从链接中合并步骤,但没有工作,并得到以下错误: /usr/bin/ld:尝试动态对象的静态链接`/usr/lib/x86_64-linux-gnu/libglu.so'collect2:错误:ld返回1退出状态src/cmakefiles/wwest-export-app.out.dir/build.make:774:recipe for targe'bin/ww

  • 本文向大家介绍Python编译为二进制so可执行文件实例,包括了Python编译为二进制so可执行文件实例的使用技巧和注意事项,需要的朋友参考一下 通过cpython把python的文件转换为二进制文件,达到代码保护的目的 1、下载Cython-0.28.2.tar.gz python setup.py install安装 2、创建你需要打包成二进制的python文件 3、创建一个setup.py

  • 问题内容: 有没有办法查看在* nix中使用了哪些编译器和标志来创建可执行文件?我已经编译了一个旧版本的代码,我想看看它是经过优化还是未经优化而编译的。Google并没有太大的帮助,但是我不确定我使用的关键字是否正确。 问题答案: gcc 为此提供了一个选项: 之后,ELF可执行文件将包含带有该信息的部分。 当然,如果没有该选项编译的可执行文件将无法使用。 对于简单的优化情况,如果文件是使用调试信

  • 问题内容: 我刚刚使用Eclipse编写了一个简单程序,并且想将其编译为可执行文件,但似乎根本找不到如何执行的方法。 问题答案: 你可以通过以下方式将.jar文件转换为.exe: 1- JSmooth .exe包装器: JSmooth是Java可执行包装器。它为Java应用程序创建本机Windows启动器(标准.exe)。由于它能够自行查找任何已安装的Java VM,因此它使Java部署更加流畅和

  • 问题内容: 我已经用python编写了GTK应用程序。 所有图形用户界面都位于林间空地文件中,并且使用了一些图像。我希望将我的应用程序编译成EXEcutable文件。为此,我正在使用 PyInstaller 编译器和 UPX 包装器。 我已经按照手册说的做了: PyInstaller可以完美运行并创建一个exe文件。但是,要使我的应用程序正常工作,我必须将林间 空地 和 图像 文件复制到exe的文

  • 问题内容: 我编写了一个hello world Go程序,该程序在linux机器上生成了本机可执行文件。但是我很惊讶地看到简单的Hello world Go程序的大小为1.9MB! 为什么Go中如此简单的程序的可执行文件如此庞大? 问题答案: 确切的问题出现在官方常见问题解答中: 为什么我的琐碎程序这么大的二进制文件? 引用答案: 在GC工具链(连接体,和)做静态链接。因此,所有Go二进制文件都包