2014-09-08 21 views
15

Provo a compilare un progetto Python sotto Windows 7 usando PyInstaller. Il progetto funziona bene, non ci sono problemi, tuttavia quando provo a compilarlo il risultato non funziona. Anche se ho nessun avviso durante la compilazione ci sono molti nel file warnmain.txt nella directory build: warnmain.txtPyInstaller - nessun modulo chiamato

non capisco davvero questi avvertimenti, per esempio no module named numpy.pi poiché numpy.pi è alcun modulo, ma un numero. Non ho mai provato a importare numpy.pi. Ho importato numpy e matplotlib in modo esplicito. Inoltre sto usando PyQt4. Ho pensato che l'errore potrebbe essere correlato a quelle librerie.

Tuttavia sono stato in grado di compilare un semplice script che utilizza con successo NumPy:

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_()) 

successo qui significa che il file eseguibile creato in realtà ha mostrato l'output desiderato. Tuttavia, esiste anche un file warnmain.txt che contiene esattamente gli stessi "avvertimenti" di quello precedente. Quindi immagino che il fatto che la compilazione del mio progetto attuale non dia alcun successo non sia (o almeno non solo) correlato a quegli avvertimenti. Ma cos'altro potrebbe essere l'errore allora? L'unico risultato durante la compilazione è 'INFO e nessuna delle è una dichiarazione negativa.

Non ho specificato una directory di hook aggiuntiva ma i hook su cui giù utilizzando la directory di default per quanto ho potuto leggere dall'output di compilazione, ad es. hook-matplotlib è stato eseguito. Non potevo vedere nessun hook per numpy né potrei per il mio piccolo script di esempio, ma questo ha funzionato. Ho usato le seguenti importazioni nei miei file (non tutti nello stesso, ma in quelle diverse):

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 

Qualcuno sa che questo problema potrebbe essere correlato a? Poiché PyInstaller non fornisce errori/avvertenze, non sono riuscito a capire se il problema è correlato alle librerie o se c'è qualcos'altro da considerare.

Aggiornamento

Dopo il suggerimento di JoranBeasley ho compilato il programma senza -w e reindirizzato lo stdout e stderr in un file. Quando si esegue il programma ho ottenuto le seguenti ImportError s:

no module named Tkinter # seemed to be required by matplotlib 

e dopo l'aggiunta import Tkinter all'inizio del mio file principale ho ottenuto

no module named FileDialog # seemed to be required also by matplotlib 

e dopo ho finalmente aggiunto import FileDialog Il programma funziona in realtà!

+0

si ottiene un errore quando si tenta di avviare il programma da linea di comando? o semplicemente non si avvia e non viene stampato nulla (qt reindirizza lo stdout in qualche altro posto come una finestra di output che si chiude quando si blocca?) ... per approfondire il mio commento sospetto si abbia un crash (probabilmente da qualcosa che usa json/risorse XML o qualcosa (non importa xxxx) ... e il messaggio di errore viene stampato su una finestra QT che finisce per chiudersi quando si blocca ... vedere se qt.App ha un reindirizzamento = False opzione o qualcosa per mantenere il stdout –

+0

È interessante notare che, se dovessi fare qualcosa come "import numpy.sinh", ricevo "ImportError: nessun modulo chiamato sinh", ed è solo quando eseguo "import numpy.numpy.sinh" che ottengo "ImportError: No module named numpy.sinh'. Hai controllato [PyInstaller per scoprire cosa è andato storto] (http://pythonhosted.org/PyInstaller/#finding-out-what-went-wrong)? per catturare errori/importazioni dettagliate/informazioni di debug? – ssnobody

+0

@JoranBeasley: ho appena provato a lanciare l'exe dal cmd senza alcun risultato, ma per comp iling Ho usato il flag '-w' (vedi http://pythonhosted.org/PyInstaller/#options-for-the-executable-output) che impedisce a Windows di avviare una console per qualsiasi input/output. Se compilassi senza '-w' non riesco a ottenere l'interfaccia utente grafica. Tuttavia il programma funziona bene quando si richiama dall'interprete, quindi non penso che sia un errore all'interno. @ssnobody: Sono a conoscenza di quel collegamento ma non ha portato alcun beneficio per me. 'import numpy.sinh' non funzionerà dato che' sinh' non è un modulo. –

risposta

5

Il problema erano alcune dipendenze di runtime di matplotlib. Quindi la compilazione andava bene durante l'esecuzione del programma ha gettato alcuni errori. Perché il terminale si è chiuso immediatamente, non me ne sono reso conto. Dopo aver reindirizzato a stdout e stderr in un file, ho potuto vedere che mi mancavano le librerie Tkinter e FileDialog. L'aggiunta di due import nella parte superiore del principale ha risolto questo problema.

+1

Questo è il comando di reindirizzamento che ho usato: myprogram.exe 1> errors.txt 2> & 1 --- Ho ottenuto lo stesso risultato di te ... Mancavo anche i moduli Tkinter e FileDialog :) Grazie, molto apprezzato. – panofish

+0

Quindi il problema è che PyInstaller non rileva importazioni di secondo livello?O non era questo un progetto con un setup.py? – Efren

+0

Sì. Se si importa un modulo e questo modulo importa da solo altri moduli, PyInstaller apparentemente non realizzerà tali importazioni di secondo livello. –

0

Ho avuto lo stesso problema con pyinstaller 3.0 e weblib. L'importazione nel principale non ha aiutato.

L'aggiornamento a 3.1 e l'eliminazione di tutti i file di build hanno aiutato.

pip install --upgrade pyinstaller 
4

Ha avuto un problema simile con no module named FileDialog. Scoperto che con la versione 3.2, potrei usare

pyinstaller --hidden-import FileDialog ...

invece di modificare il mio script principale.

4

Pyinstaller non vedrà importazioni di secondo livello. Quindi se si importa il modulo A, pyinstaller lo rileva. Tuttavia, qualsiasi modulo aggiuntivo importato in A non verrà visualizzato.

Non è necessario modificare nulla negli script Python. È possibile aggiungere direttamente le importazioni mancanti al file spec . Basta modificare la riga seguente:

hiddenimports=[], 

a

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

Se la questione è che non hai bisogno di Tkinter e gli amici perché si sta utilizzando PyQt4, allora potrebbe essere meglio evitare di carico Tkinter ecc del tutto. Se vuoi in/etc/matplotlibrc e modificare le impostazioni predefinite per PyQt4, vedere le 'modificato' righe sotto:

#### 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 
Problemi correlati