python - PyInstaller 后运行 Kivy 时出错:pyi_rth_pkgres、wordcount.kv、无法获取窗口等
问题描述
我需要--onedir
使用 PyInstaller 为我的 Windows Kivy 应用程序编译一个独立的执行程序或它的版本。我一个接一个地遇到问题,这就是我在这里发布它的原因。我几乎可以找到所有问题的解决方案,但似乎从一开始就有问题。
该程序由.py和.kv文件组成,仅需要(除了Kivy模块)Textract(导入as txt
)并且如果我使用 IDLE 的 shell 可以完美运行。
我使用最新版本的Kivy和PyInstaller(如果 PyInstaller 我也尝试过开发人员版本,正如一些人建议的那样)。
我遇到的第一个问题是
ModuleNotFoundError: No module named 'pkg_resources.py2_warn'
[4808] Failed to execute script pyi_rth_pkgres
我解决的
pyinstaller wordcount.py --hiddenimport pkg_resources.py2_warn
正如一些人之前建议的那样处理这个问题。然后,充满了愉快的期望,我再次运行.exe并得到这个:
FileNotFoundError: [Errno 2] No such file or directory: 'wordcount.kv'
[3356] Failed to execute script wordcount
显然,.kv不知何故未包含在包中,好吧,我再次更改命令:
pyinstaller wordcount.py --add-data "./wordcount.kv;." --hiddenimport pkg_resources.py2_warn
手动强制将.kv放入包中。或者我可以把它复制到那里——结果相同:
[WARNING] [Image ] Unable to load image <C:\GUI Projects\wordcount\dist\wordcount\kivy_install\data\glsl\default.png>
[CRITICAL] [Window ] Unable to find any valuable Window provider. Please enable debug logging (e.g. add -d if running from the command line, or change the log level in the config) and re-run your app to identify potential causes
sdl2 - Exception: SDL2: Unable to load image
File "site-packages\kivy\core\__init__.py", line 71, in core_select_lib
File "site-packages\kivy\core\window\window_sdl2.py", line 152, in __init__
File "site-packages\kivy\core\window\__init__.py", line 981, in __init__
File "site-packages\kivy\core\window\window_sdl2.py", line 312, in create_window
File "site-packages\kivy\core\window\__init__.py", line 1258, in create_window
File "kivy\graphics\instructions.pyx", line 783, in kivy.graphics.instructions.RenderContext.__init__
File "site-packages\kivy\core\image\__init__.py", line 561, in __init__
File "site-packages\kivy\core\image\__init__.py", line 756, in _set_filename
File "site-packages\kivy\core\image\__init__.py", line 460, in load
File "site-packages\kivy\core\image\__init__.py", line 223, in __init__
File "site-packages\kivy\core\image\img_sdl2.py", line 47, in load
[CRITICAL] [App ] Unable to get a Window, abort.
正如人们所建议的那样,onw 可能只是将.dll复制到目录([Dist]\\libpng16-16.dll)。或者重写规范。像这样:
......很遗憾,没有任何积极的结果。
Traceback (most recent call last):
File "wordcount.py", line 47, in <module>
WordCount().run()
File "site-packages\kivy\app.py", line 855, in run
File "site-packages\kivy\base.py", line 504, in runTouchApp
File "site-packages\kivy\core\window\window_sdl2.py", line 747, in mainloop
File "site-packages\kivy\core\window\window_sdl2.py", line 479, in _mainloop
File "site-packages\kivy\base.py", line 339, in idle
File "site-packages\kivy\clock.py", line 591, in tick
File "kivy\_clock.pyx", line 384, in kivy._clock.CyClockBase._process_events
File "kivy\_clock.pyx", line 414, in kivy._clock.CyClockBase._process_events
File "kivy\_clock.pyx", line 412, in kivy._clock.CyClockBase._process_events
File "kivy\_clock.pyx", line 167, in kivy._clock.ClockEvent.tick
File "site-packages\kivy\uix\filechooser.py", line 698, in _update_files
File "site-packages\kivy\uix\filechooser.py", line 718, in _create_files_entries
File "site-packages\kivy\uix\filechooser.py", line 839, in _generate_file_entries
File "site-packages\kivy\uix\filechooser.py", line 871, in _add_files
File "site-packages\kivy\uix\filechooser.py", line 871, in <listcomp>
File "site-packages\kivy\uix\filechooser.py", line 178, in is_hidden
ModuleNotFoundError: No module named 'win32timezone'
[10576] Failed to execute script wordcount
此外,我很确定这只是一个开始。还有其他解决方案吗?
任何帮助将不胜感激。我知道这些问题之前已经讨论过,我提前道歉,但我找到的解决方案都不适合我。
PS: warn.txt中的“缺失模块”列表和万里长城一样长,正常吗?特别是考虑到只有两个模块在使用。
解决方案
好吧,我解决了这个问题,但解决方案不是很优雅:
pyinstaller --add-data "./wordcount.kv;." --hiddenimport pkg_resources.py2_warn --hiddenimport win32timezone --hiddenimport textract.parsers.pptx_parser --hiddenimport textract.parsers.docx_parser wordcount.py
然后我将libpng16-16.dll从 Python 文件夹之一复制到 /dist/ 文件夹。
如果有人知道更好的方法,请分享它...
推荐阅读
- java - 如何将 Row 中的结构字段转换为 Spark Java 中的 avro 记录
- firebase - 拒绝删除资源上的一个属性
- c# - Excel 互操作在另一个相同代码中的一个解决方案中工作会产生错误(将 xlsx 解析为 DataTable)
- c - 无法运行此 C 程序 - 文件范围错误
- excel - 如何根据多列将一行拆分为多行?
- node.js - 如何使用 node.js aws-sdk、cloudwatch 和 lambda 函数安排调用 API
- visual-studio-code - vscode中空白的红色突出显示
- macos - Applescript -- osx mail -- 如果段落以 3 位数字开头,则将某些单词加粗
- ios - 是否可以读取我的应用程序的运行时内存(存储在变量中的内容)?
- javascript - 将元素定位到正确顺序的JS递归算法问题