由于 window 问题,Kivy 应用程序在使用 pyinstaller 打包后崩溃
Kivy app crashes after being packaged with pyinstaller due to window issue
我正在尝试使用 Pyinstaller 打包我的 kivy 项目,但它崩溃并吐出这个
[CRITICAL ] [Window ] Unable to find any valuable Window provider at all!
sdl2 - Exception: SDL2: Unable to load image
File "site-packages\kivy\core\__init__.py", line 67, in core_select_lib
File "site-packages\kivy\core\window\window_sdl2.py", line 138, in __init__
File "site-packages\kivy\core\window\__init__.py", line 722, in __init__
File "site-packages\kivy\core\window\window_sdl2.py", line 255, in
create_window
File "site-packages\kivy\core\window\__init__.py", line 897, in create_window
File "kivy\graphics\instructions.pyx", line 756, in
kivy.graphics.instructions.RenderContext.__init__ (kivy\graphics\instructions.c:10729)
File "site-packages\kivy\core\image\__init__.py", line 512, in __init__
File "site-packages\kivy\core\image\__init__.py", line 700, in _set_filename
File "site-packages\kivy\core\image\__init__.py", line 430, in load
File "site-packages\kivy\core\image\__init__.py", line 198, in __init__
File "site-packages\kivy\core\image\img_sdl2.py", line 42, in load
[INFO ] [Audio ] Providers: audio_sdl2 (audio_ffpyplayer ignored)
[CRITICAL ] [App ] Unable to get a Window, abort.
Exception ignored in: 'kivy.properties.dpi2px'
Traceback (most recent call last):
File "site-packages\kivy\utils.py", line 513, in __get__
File "site-packages\kivy\metrics.py", line 175, in dpi
File "site-packages\kivy\base.py", line 126, in ensure_window
SystemExit: 1
[CRITICAL ] [App ] Unable to get a Window, abort.
Exception ignored in: 'kivy.properties.dpi2px'
Traceback (most recent call last):
File "site-packages\kivy\utils.py", line 513, in __get__
File "site-packages\kivy\metrics.py", line 175, in dpi
File "site-packages\kivy\base.py", line 126, in ensure_window
SystemExit: 1
[CRITICAL ] [App ] Unable to get a Window, abort.
我没有创建自己的规范文件我选择通过命令行传递所需的参数来完成它有什么建议吗?
这是pyinstaller生成的spec文件
# -*- mode: python -*-
block_cipher = None
a = Analysis(['apv.py'],
pathex=['C:\Python34\Lib\site-packages\kivy', 'C:\Python34', 'C:\Python34\Lib', 'C:\Python34\Lib\site-packages', 'C:\Users\suroh\Desktop\my-python-modules', 'C:\Python34\Lib\site-packages\kivy\deps', 'C:\Python34\Lib\site-packages\kivy\graphic', 'C:\Python34\DLLs', 'C:\Python34\libs', 'C:\Python34\Scripts', 'C:\Python34\share\sdl2\bin', 'C:\Python34\share\glew\bin', 'C:\Python34\share', 'C:\Python34\Tools', 'C:\Python34\Lib\ctypes', 'C:\Python34\Lib\distutils', 'C:\Users\suroh\Desktop\Python Projects\testp\Beta 01'],
binaries=None,
datas=None,
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=['pygame'],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='apv',
debug=False,
strip=False,
upx=True,
console=False , icon='LauncherIcon.ico')
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='apv')
如果您没有创建 spec 文件,您仍然需要 打包 Collect()
.here 中的依赖项。
正如在 pyinstaller 的 docs 中提到的那样:
You can give additional files on the pyinstaller command line.
这意味着你可以做 --add-data
or you can dump the spec somewhere and edit it manually with --specpath
. Here 就是 Collect()
基本上打包东西的方式。
编辑:
是的,你肯定错过了部门。看看kivy的规格。
如果您想要 --add-data
,您应该检查 kivy.deps
文件夹和其中的 __init__()
s,因为它们会告诉您要查找的路径。但是手动编辑规范比较省时。
我正在尝试使用 Pyinstaller 打包我的 kivy 项目,但它崩溃并吐出这个
[CRITICAL ] [Window ] Unable to find any valuable Window provider at all!
sdl2 - Exception: SDL2: Unable to load image
File "site-packages\kivy\core\__init__.py", line 67, in core_select_lib
File "site-packages\kivy\core\window\window_sdl2.py", line 138, in __init__
File "site-packages\kivy\core\window\__init__.py", line 722, in __init__
File "site-packages\kivy\core\window\window_sdl2.py", line 255, in
create_window
File "site-packages\kivy\core\window\__init__.py", line 897, in create_window
File "kivy\graphics\instructions.pyx", line 756, in
kivy.graphics.instructions.RenderContext.__init__ (kivy\graphics\instructions.c:10729)
File "site-packages\kivy\core\image\__init__.py", line 512, in __init__
File "site-packages\kivy\core\image\__init__.py", line 700, in _set_filename
File "site-packages\kivy\core\image\__init__.py", line 430, in load
File "site-packages\kivy\core\image\__init__.py", line 198, in __init__
File "site-packages\kivy\core\image\img_sdl2.py", line 42, in load
[INFO ] [Audio ] Providers: audio_sdl2 (audio_ffpyplayer ignored)
[CRITICAL ] [App ] Unable to get a Window, abort.
Exception ignored in: 'kivy.properties.dpi2px'
Traceback (most recent call last):
File "site-packages\kivy\utils.py", line 513, in __get__
File "site-packages\kivy\metrics.py", line 175, in dpi
File "site-packages\kivy\base.py", line 126, in ensure_window
SystemExit: 1
[CRITICAL ] [App ] Unable to get a Window, abort.
Exception ignored in: 'kivy.properties.dpi2px'
Traceback (most recent call last):
File "site-packages\kivy\utils.py", line 513, in __get__
File "site-packages\kivy\metrics.py", line 175, in dpi
File "site-packages\kivy\base.py", line 126, in ensure_window
SystemExit: 1
[CRITICAL ] [App ] Unable to get a Window, abort.
我没有创建自己的规范文件我选择通过命令行传递所需的参数来完成它有什么建议吗?
这是pyinstaller生成的spec文件
# -*- mode: python -*-
block_cipher = None
a = Analysis(['apv.py'],
pathex=['C:\Python34\Lib\site-packages\kivy', 'C:\Python34', 'C:\Python34\Lib', 'C:\Python34\Lib\site-packages', 'C:\Users\suroh\Desktop\my-python-modules', 'C:\Python34\Lib\site-packages\kivy\deps', 'C:\Python34\Lib\site-packages\kivy\graphic', 'C:\Python34\DLLs', 'C:\Python34\libs', 'C:\Python34\Scripts', 'C:\Python34\share\sdl2\bin', 'C:\Python34\share\glew\bin', 'C:\Python34\share', 'C:\Python34\Tools', 'C:\Python34\Lib\ctypes', 'C:\Python34\Lib\distutils', 'C:\Users\suroh\Desktop\Python Projects\testp\Beta 01'],
binaries=None,
datas=None,
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=['pygame'],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='apv',
debug=False,
strip=False,
upx=True,
console=False , icon='LauncherIcon.ico')
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='apv')
如果您没有创建 spec 文件,您仍然需要 打包 Collect()
.here 中的依赖项。
正如在 pyinstaller 的 docs 中提到的那样:
You can give additional files on the pyinstaller command line.
这意味着你可以做 --add-data
or you can dump the spec somewhere and edit it manually with --specpath
. Here 就是 Collect()
基本上打包东西的方式。
编辑: 是的,你肯定错过了部门。看看kivy的规格。
如果您想要 --add-data
,您应该检查 kivy.deps
文件夹和其中的 __init__()
s,因为它们会告诉您要查找的路径。但是手动编辑规范比较省时。