Ningún módulo nombrado al usar PyInstaller

Intento comstackr un proyecto de Python en Windows 7 usando PyInstaller. El proyecto funciona bien, no hay problemas, sin embargo, cuando bash comstackrlo, el resultado no funciona. Aunque no recibo advertencias durante la comstackción, hay muchas en el archivo warnmain.txt en el directorio de build : warnmain.txt

Realmente no entiendo esas advertencias, por ejemplo, “no hay módulo llamado numpy.pi” ya que numpy.pi no es un módulo sino un número. Nunca intenté importar numpy.pi . numpy y matplotlib explícitamente. Además estoy usando PyQt4. Pensé que el error podría estar relacionado con esas bibliotecas.

Sin embargo, pude comstackr un script simple que usa numpy exitosamente:

 import sys from PyQt4 import QtGui, QtCore import numpy as np class MainWindow(QtGui.QMainWindow): def __init__(self): QtGui.QMainWindow.__init__(self) self.pb = QtGui.QPushButton(str(np.pi), self) app = QtGui.QApplication(sys.argv) main = MainWindow() main.show() sys.exit(app.exec_()) 

Con éxito aquí significa que el archivo ejecutable creado realmente mostró el resultado deseado. Sin embargo, también hay un archivo warnmain.txt creado que contiene exactamente las mismas ‘advertencias’ que la anterior. Así que supongo que el hecho de que la comstackción de mi proyecto real no dé ningún éxito no está (o al menos no solo) relacionado con esas advertencias. Pero ¿qué otra cosa podría ser el error entonces? Los únicos resultados durante la comstackción son ‘INFO’s’ y ninguno de ellos es una statement negativa.

No especifiqué un directorio de enganche adicional, pero los enganches se redujeron al usar el directorio predeterminado hasta donde pude leer desde la salida de comstackción, por ejemplo, se ejecutó hook-matplotlib . No pude ver ningún gancho para numpy ni pude ver mi pequeño script de ejemplo, pero este funcionó. Utilicé las siguientes importaciones en mis archivos (no todos en los mismos sino en diferentes):

 import numpy as np import matplotlib.pyplot as ppl from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar from PyQt4 import QtGui, QtCore import json import sys import numpy # added this one later import matplotlib # added this one later 

Como PyInstaller no da ningún error / advertencia, no pude averiguar si el problema está relacionado con las bibliotecas o si hay algo más que considerar.

Tenía un problema similar con no module named FileDialog . Descubrí que con la versión 3.2, podría usar

pyinstaller --hidden-import FileDialog ...

En lugar de modificar mi script principal.

Pyinstaller no verá las importaciones de segundo nivel . Así que si importas el módulo A , Pyinstaller ve esto. Pero cualquier módulo adicional que se importe en A no se verá.

No hay necesidad de cambiar nada en tus scripts de python. Puede agregar directamente las importaciones faltantes al archivo de especificaciones . Solo cambia la siguiente línea:

 hiddenimports=[], 

a

 hiddenimports=["Tkinter", "FileDialog"], 

El problema fueron algunas dependencias de matplotlib en tiempo de ejecución. Así que la comstackción estuvo bien mientras ejecutaba el progtwig arrojó algunos errores. Porque la terminal se cerró de inmediato, no me di cuenta de eso. Después de redirigir stdout y stderr a un archivo, pude ver que me perdí las bibliotecas Tkinter y FileDialog . La adición de dos import en la parte superior de la principal resolvió este problema.

Si lo que importa es que no necesita Tkinter y sus amigos porque está usando PyQt4, entonces sería mejor evitar la carga de Tkinter, etc. Busque en / etc / matplotlibrc y cambie los valores predeterminados a PyQt4, vea las líneas ‘modificadas’ a continuación:

 #### CONFIGURATION BEGINS HERE # The default backend; one of GTK GTKAgg GTKCairo GTK3Agg GTK3Cairo # CocoaAgg MacOSX Qt4Agg Qt5Agg TkAgg WX WXAgg Agg Cairo GDK PS PDF SVG # Template. # You can also deploy your own backend outside of matplotlib by # referring to the module name (which must be in the PYTHONPATH) as # 'module://my_backend'. #modified #backend : TkAgg backend : Qt4Agg # If you are using the Qt4Agg backend, you can choose here # to use the PyQt4 bindings or the newer PySide bindings to # the underlying Qt4 toolkit. #modified #backend.qt4 : PyQt4 # PyQt4 | PySide backend.qt4 : PyQt4 # PyQt4 | PySide 

Tuve el mismo problema con pyinstaller 3.0 y weblib . Importarlo en lo principal no ayudó.

La actualización a 3.1 y la eliminación de todos los archivos de comstackción ayudó.

 pip install --upgrade pyinstaller