PyInstalled Kivy App无法在第二台计算机上运行 [英] PyInstalled Kivy App Fails to Run on Second Machine

查看:98
本文介绍了PyInstalled Kivy App无法在第二台计算机上运行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用PyInstaller(3.4)打包Kivy应用程序,以便在Windows计算机上使用.我已经将其编译并在我的机器上工作,但是当将exe移至另一个时,它无法给出错误:

I'm packaging a Kivy app using PyInstaller (3.4) for use on Windows machines. I've gotten it to compile and work on my machine but when moving the exe to another, it fails giving the error:

[WARNING] [Image       ] Unable to load image 
C:\Users\<OTHER_MACHINES_USER>\AppData\Local\Temp_MEI38442\kivy_install\data\glsl\default.png>
[CRITICAL] [Window      ] Unable to find any valuable Window provider.
sdl2 - Exception: SDL2: Unable to load image

这是从dist文件夹中复制整个内容时起作用的(如在./dist/client_iface.exe中),因此我认为这是我无法解决的依赖关系问题,显然是SDL2.

This works from the dist folder when the whole thing is copied across (as in ./dist/client_iface.exe) and so I figure its a dependency issue I've been unable to resolve, apparently with SDL2.

我认为这个问题几乎与这个问题,但是这个问题已有两年历史了,目前还没有成功的解决方案.

I believe that this problem is almost identical to this problem however that question is two years old and as yet has no successful solution.

我已经遵循了许多指南(包括这本指南,与上面的文章链接在一起),但没有成功.

I've followed a number of guides (including this one which is linked from the above post) but with no success.

规格文件,并根据 Kivy指南进行了调整,如下所示:

The spec file, with adjustments as per the Kivy guide, is as follows:

# -*- mode: python -*-

from kivy.deps import sdl2, glew
import os

block_cipher = None

a = Analysis(
    ['client_iface.py'],
    pathex=['D:\\Users\\<USER>\\Documents\\2_Projects\\py_dice_roller\\client'],
    binaries=[('D:\\Users\\<USER>\\Documents\\2_Projects\\DnD\\py_dice_roller\\client\\SDL2.dll', '.')],
    datas=[],
    hiddenimports=[],
    hookspath=[],
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False
)
a.datas += [
    ('client_iface.kv', '.\\client_iface.kv', 'DATA'), 
    ('active.png', '.\\images\\active.png', 'DATA'),
    ('back.png', '.\\images\\active.png', 'DATA'),
    ('normal.png', '.\\images\\active.png', 'DATA'),
    ('DroidSansMono.ttf', '.\\fonts\\DroidSansMono.ttf', 'DATA')
]
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher
)
exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.zipfiles,
    a.datas,
    [],
    name='client_iface',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    runtime_tmpdir=None,
    console=True,
    icon='.\images\icon_dWU_icon.ico',
)
coll = COLLECT(
    exe, Tree(os.getcwd()),
    a.binaries,
    a.zipfiles,
    a.datas,
    *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
    strip=False,
    upx=True,
    name='client_iface'
)

并按照上面的链接,我在脚本中包含了以下代码:

And following the above linked I have included the following code in the script:


def resourcePath(path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS)

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

if __name__ == '__main__':
    kivy.resources.resource_add_path(resourcePath('.'))
    kivy.resources.resource_add_path(resourcePath('./images'))
    main_app().run()

我正在使用的命令是:

python -m PyInstaller -F --onefile .\client_iface.spec

预期结果是,生成的单个可执行文件将在任何类似的机器上运行,而不会出错或不需要整个文件夹的其他文件.

The expected result would be that the single executable produced would run on any like-machine without error-ing or the need for the entire folder of additional files.

任何帮助将不胜感激.

推荐答案

.spec文件的COLLECT部分指示将创建onedir可执行文件.为了使onefile可执行文件,您将需要删除COLLECT部分.另外,可以将COLLECT部分中列出的sdl2和glew deps作为*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)]添加到EXE部分中,以代替出现在第一个关键字参数之前的默认[],.

The COLLECT section of your .spec file indicates that a onedir executable will be created. In order to make a onefile executable, you will need to remove the COLLECT section. Also, the sdl2 and glew deps that are listed in the COLLECT section can be added to the EXE section as *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)] in place of the default [], that appears before the first keyword argument.

此外,请注意,如果您使用的是.spec文件,则会忽略Pyinstaller的大多数命令行选项.有关更多详细信息,请参见文档.不幸的是,Pyinstaller文档在很多地方都比较模糊.

Also, note that most of the command line options of Pyinstaller are ignored if you are using a .spec file. Refer to the documentation for more details. Unfortunately, the Pyinstaller documentation is rather vague in many places.

这篇关于PyInstalled Kivy App无法在第二台计算机上运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆