Pyinstaller y problema de importación con wx.lib.pubsub

Mi aplicación Python GUI funciona perfectamente, pero cuando bash crear un ejecutable, lo intenté con el comando pyinstaller (3.3.dev0 + 483c819):

pyinstaller gui_app.py 

Me sale el siguiente problema:

 7699 INFO: Loading module hook "hook-wx.lib.pubsub.py"... Traceback (most recent call last): File "", line 41, in  File "", line 36, in walk_packages File "", 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  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! 

El ejecutable se creó “con éxito” pero cuando lo ejecuto obtengo el siguiente error:

 Traceback (most recent call last): File "upload_test_run_dynamic_clean.py", line 21, in  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  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  ImportError: No module named publisher 

Intenté agregar hookspath es el archivo de especificaciones (existe un gancho para wx.lib.pubsub que ya se encuentra en la carpeta de ganchos de pyinstaller) pero no funcionó, o hice algo mal.

¿Hay una orden para importar wx y otros submódulos. Tengo esto en mi codigo

 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! 

Estos módulos faltan en el núcleo, muévelos hacia atrás en caso de que haya colocado mal los módulos.

Al parecer, la importación de esos módulos se realiza en la subcarpeta kwargs, pero esos archivos realmente deben colocarse en la carpeta raíz.

Así que acabo de copiar esos archivos de

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

a

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

y ahora funciona!

Me encontré con el mismo problema, que sigue presente después del lanzamiento de pyinstaller 3.3. Este es un problema conocido con wx.lib.pubsub y pyinstaller. Consulte https://github.com/pyinstaller/pyinstaller/issues/1530 ; al parecer, las importaciones se manejan de una manera que es difícil de solucionar. PyPubSub es una bifurcación de la misma base de código y tendrá el mismo problema. Si no quiere piratear las librerías de la distribución wx con cada versión, sus opciones incluyen:

  • Usar la versión 3.2 de pyinstaller (3.2 se bloquea con fuerza para mí, por lo que no es alentador)
  • Espero que esté arreglado en pyinstaller 3.4 (parece poco probable que esto ocurra)
  • Cambie a PyDispatcher u otra biblioteca de pubsub más simple
  • Modifique PyPubSub para que cargue los módulos de una manera que sea compatible con pyinstaller, y envíe el PR de nuevo al proyecto

El camino de menor resistencia parece ser encontrar una biblioteca de pubsub diferente. Cambié a blinker, que es mínimo y bueno para proyectos más pequeños. Sin embargo, también tenga en cuenta que pyinstaller 3.3 aún no es completamente estable en Python 3.6. Me doy cuenta de que esta es una pregunta antigua, pero para cualquier persona que encuentre esta pregunta más adelante, puede intentar la 3.5.

He tenido problemas similares al empaquetar plataformas cruzadas donde diferentes plataformas requerían versiones específicas de python y pyinstaller. Tenga en cuenta que con pyinstaller suele haber una combinación de versión estable, y esto varía según la plataforma.

Me encontré con este problema recientemente y encontré otra solución que funcionó para mí. He reemplazado from wx.lib.pubsub import pub con from pubsub import pub . Es posible que tenga que hacer un pip install pypubsub para obtener el paquete necesario. Puede encontrar más información aquí: https://github.com/schollii/pypubsub/issues/7