首页 > 解决方案 > PyInstaller 后运行 Kivy 时出错:pyi_rth_pkgres、wordcount.kv、无法获取窗口等

问题描述

我需要--onedir使用 PyInstaller 为我的 Windows Kivy 应用程序编译一个独立的执行程序或它的版本。我一个接一个地遇到问题,这就是我在这里发布它的原因。我几乎可以找到所有问题的解决方案,但似乎从一开始就有问题。

该程序由.py.kv文件组成,仅需要(除了Kivy模块)Textract(导入as txt)并且如果我使用 IDLE 的 shell 可以完美运行。

我使用最新版本的KivyPyInstaller(如果 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中的“缺失模块”列表和万里长城一样长,正常吗?特别是考虑到只有两个模块在使用。

标签: pythonpython-3.xdependencieskivypyinstaller

解决方案


好吧,我解决了这个问题,但解决方案不是很优雅:

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/ 文件夹。

如果有人知道更好的方法,请分享它...


推荐阅读