wx.lib.pubsub 的 Pyinstaller 和导入问题

Pyinstaller and import issue with wx.lib.pubsub

我的 Python GUI 应用程序运行完美,但是当我尝试创建可执行文件时,我尝试使用 pyinstaller (3.3.dev0+483c819) 命令:

pyinstaller gui_app.py

我遇到以下问题:

7699 INFO: Loading module hook "hook-wx.lib.pubsub.py"...
Traceback (most recent call last):
  File "<string>", line 41, in <module>
  File "<string>", line 36, in walk_packages
  File "<string>", line 20, in walk_packages
  File "c:\python27\lib\site-packages\wx-3.0-msw\wx\lib\pubsub\core\arg1\__init__.py", line 16, in <module>
    raise RuntimeError(msg)
RuntimeError: Should not import this directly, used by pubsub.core if applicable
8006 WARNING: Hidden import "wx.lib.pubsub.core.publisher" not found!
8008 WARNING: Hidden import "wx.lib.pubsub.core.listenerimpl" not found!
8009 WARNING: Hidden import "wx.lib.pubsub.core.publishermixin" not found!
8009 WARNING: Hidden import "wx.lib.pubsub.core.datamsg" not found!
8009 WARNING: Hidden import "wx.lib.pubsub.core.topicargspecimpl" not found!
8009 WARNING: Hidden import "wx.lib.pubsub.core.topicmgrimpl" not found!

可执行文件已 "successfully" 创建,但当我启动它时出现以下错误:

Traceback (most recent call last):
  File "upload_test_run_dynamic_clean.py", line 21, in <module>
    from wx.lib.pubsub import pub
  File "c:\python27\Lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module
    exec(bytecode, module.__dict__)
  File "site-packages\wx-3.0-msw\wx\lib\pubsub\pub.py", line 35, in <module>
  File "c:\python27\Lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module
    exec(bytecode, module.__dict__)
  File "site-packages\wx-3.0-msw\wx\lib\pubsub\core\__init__.py", line 45, in <module>
ImportError: No module named publisher

我试图添加 hookspath 是 spec 文件(在 pyinstaller hooks 文件夹中已经存在 wx.lib.pubsub 的钩子)但是它没有用,或者我做错了什么。

是否有导入wx和其他子模块的命令。 我的代码中有这个

import wx
import wx.lib.pubsub.setuparg1
from wx.lib.pubsub import pub
import wx.lib.agw.pybusyinfo as PBI
from wx.lib.scrolledpanel import ScrolledPanel
8006 WARNING: Hidden import "wx.lib.pubsub.core.publisher" not found!
8008 WARNING: Hidden import "wx.lib.pubsub.core.listenerimpl" not found!
8009 WARNING: Hidden import "wx.lib.pubsub.core.publishermixin" not found!
8009 WARNING: Hidden import "wx.lib.pubsub.core.datamsg" not found!
8009 WARNING: Hidden import "wx.lib.pubsub.core.topicargspecimpl" not found!
8009 WARNING: Hidden import "wx.lib.pubsub.core.topicmgrimpl" not found!

核心中缺少这些模块,如果您放错了模块,请将它们移回那里。

显然这些模块的导入是在子文件夹 kwargs 中完成的,但这些文件实际上需要放在根文件夹中。

所以我刚刚从

复制了这些文件
Lib\site-packages\wx-3.0-msw\wx\lib\pubsub\core\kwargs

Lib\site-packages\wx-3.0-msw\wx\lib\pubsub\core

现在成功了!

我运行遇到了同样的问题,pyinstaller 3.4发布后仍然存在。这是将 wx.lib.pubsub、PyPubSub 或 pypubsub 中的任何一个与 pyinstaller 一起使用时的已知问题。参见 https://github.com/pyinstaller/pyinstaller/issues/1530 ;显然,进口的处理方式很难解决。 PyPubSub 和 pypubsub 是同一代码库的分支,也会有同样的问题。如果不想在每个版本中破解 wx 发行版的库,您的选择包括:

  • 切换到 PyDispatcher、blinker 或其他更简单的 pubsub 库
  • 修改 PyPubSub,使其以与 pyinstaller 兼容的方式加载模块,并将 PR 提交回项目

阻力最小的途径似乎是找到不同的 pubsub 库。我切换到 blinker,它是最小的,适合较小的项目。

另一个提示:请注意,对于 pyinstaller,通常有一个稳定的版本组合,这因平台而异。

我最近 运行 遇到了这个问题,我找到了另一个适合我的解决方案。我用 from pubsub import pub 替换了 from wx.lib.pubsub import pub。您可能已经执行 pip install pypubsub 以获得所需的包。您可以在这里找到更多信息: https://github.com/schollii/pypubsub/issues/7