PyInstalled Kivy 应用程序无法在第二台机器上 运行
PyInstalled Kivy App Fails to Run on Second Machine
我正在使用 PyInstaller (3.4) 打包一个 Kivy 应用程序,以便在 Windows 机器上使用。我已经让它在我的机器上编译和工作但是当将 exe 移动到另一个时,它没有给出错误:
[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/client_iface.exe
),这从 dist
文件夹开始工作,所以我认为这是一个我一直无法解决的依赖问题,显然是使用 SDL2 .
我相信这个问题几乎与 this problem 相同,但是这个问题已经存在两年了,至今还没有成功的解决方案。
我遵循了许多指南(包括从上面 post 链接的 )但没有成功。
根据the Kivy guide调整后的spec文件如下:
# -*- 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'
)
按照上面的链接,我在脚本中包含了以下代码:
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
预期的结果是生成的单个可执行文件将 运行 在任何同类机器上都不会出错,也不需要整个文件夹的附加文件。
如有任何帮助,我们将不胜感激。
.spec
文件的 COLLECT
部分表示将创建 onedir
可执行文件。为了制作 onefile
可执行文件,您需要删除 COLLECT
部分。此外,COLLECT
部分中列出的 sdl2 和 glew deps 可以添加到 EXE
部分作为 *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)]
代替出现在第一个之前的默认 [],
关键字参数。
另外请注意,如果您使用的是 .spec
文件,Pyinstaller
的大多数命令行选项都会被忽略。有关详细信息,请参阅 documentation。不幸的是,Pyinstaller
文档在很多地方都相当模糊。
我正在使用 PyInstaller (3.4) 打包一个 Kivy 应用程序,以便在 Windows 机器上使用。我已经让它在我的机器上编译和工作但是当将 exe 移动到另一个时,它没有给出错误:
[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/client_iface.exe
),这从 dist
文件夹开始工作,所以我认为这是一个我一直无法解决的依赖问题,显然是使用 SDL2 .
我相信这个问题几乎与 this problem 相同,但是这个问题已经存在两年了,至今还没有成功的解决方案。
我遵循了许多指南(包括从上面 post 链接的
根据the Kivy guide调整后的spec文件如下:
# -*- 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'
)
按照上面的链接,我在脚本中包含了以下代码:
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
预期的结果是生成的单个可执行文件将 运行 在任何同类机器上都不会出错,也不需要整个文件夹的附加文件。
如有任何帮助,我们将不胜感激。
.spec
文件的 COLLECT
部分表示将创建 onedir
可执行文件。为了制作 onefile
可执行文件,您需要删除 COLLECT
部分。此外,COLLECT
部分中列出的 sdl2 和 glew deps 可以添加到 EXE
部分作为 *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)]
代替出现在第一个之前的默认 [],
关键字参数。
另外请注意,如果您使用的是 .spec
文件,Pyinstaller
的大多数命令行选项都会被忽略。有关详细信息,请参阅 documentation。不幸的是,Pyinstaller
文档在很多地方都相当模糊。