python - studio - Ningún módulo nombrado al usar PyInstaller
pyinstaller visual studio (5)
Intento compilar un proyecto de Python en Windows 7 usando PyInstaller.
El proyecto funciona bien, no hay problemas, sin embargo, cuando intento compilarlo, el resultado no funciona.
Aunque no recibo advertencias durante la compilación, hay muchas en el archivo
warnmain.txt
en el directorio de
build
:
warnmain.txt
Realmente no entiendo esas advertencias, por ejemplo "ningún 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 compilar un script simple que usa numpy con éxito:
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 el anterior.
Así que supongo que el hecho de que compilar mi proyecto real no da ningún éxito no está (o al menos no solo) relacionado con esas advertencias.
¿Pero qué más podría ser el error entonces?
El único resultado durante la compilación son ''INFO'' y ninguno de ellos es una declaración negativa.
No especifiqué un directorio de gancho adicional, pero los ganchos estaban abajo usando el directorio predeterminado hasta donde pude leer de la salida de compilació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 el mismo pero 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
Dado que 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.
El problema eran algunas dependencias de tiempo de ejecución de matplotlib.
Así que la compilación estuvo bien mientras se ejecutaba el programa arrojó algunos errores.
Como 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 echaba de menos las bibliotecas
Tkinter
y
FileDialog
.
Agregar dos
import
en la parte superior de la página principal resolvió este problema.
Pyinstaller no verá importaciones de segundo nivel . Entonces, si importa el módulo A , pyinstaller ve esto. Pero no se verá ningún módulo adicional que se importe en A.
No hay necesidad de cambiar nada en sus scripts de Python. Puede agregar directamente las importaciones que faltan al archivo de especificaciones . Simplemente cambie la siguiente línea:
hiddenimports=[],
a
hiddenimports=["Tkinter", "FileDialog"],
Si el problema es que no necesita Tkinter y amigos porque está usando PyQt4, entonces sería mejor evitar cargar Tkinter, etc. Mire 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 general no ayudó.
La actualización a 3.1 y la eliminación de todos los archivos de compilación ayudaron.
pip install --upgrade pyinstaller
Tuve 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.