2016-06-17 34 views
7

Sto cercando di esportare il mio script .py in .exe utilizzando PyInstaller, che ha dipendenze da file .ui creati con Qt Designer.PyInstaller + UI Files - FileNotFoundError: [Errno 2] Nessun file o directory:

Posso confermare che il mio script .py funziona correttamente quando viene eseguito tramite PyCharm - Sono in grado di vedere la GUI che ho creato con i file .ui.

Tuttavia, quando esporto il mio script Py a .exe e lanciarlo, ricevo i seguenti errori nella riga di comando:

C:\Users\giranm>"C:\Users\giranm\PycharmProjects\PyQt Tutorial\dist\secSearch_demo.exe" 
Traceback (most recent call last): 
    File "secSearch_demo.py", line 13, in <module> 
    File "site-packages\PyQt4\uic\__init__.py", line 208, in loadUiType 
    File "site-packages\PyQt4\uic\Compiler\compiler.py", line 140, in compileUi 
    File "site-packages\PyQt4\uic\uiparser.py", line 974, in parse 
    File "xml\etree\ElementTree.py", line 1186, in parse 
    File "xml\etree\ElementTree.py", line 587, in parse 
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\giranm\\securitySearchForm.ui' 
Failed to execute script secSearch_demo 

Per qualche ragione, il file .exe cerca la file .ui all'interno del percorso - C: \ Users \ giranm \

Tuttavia, avendo già fatto alcune ricerche, mi è stato detto che dovevo usare os.getcwd() e assicurarmi di avere il percorso completo nel mio script . Anche con il codice qui sotto, ottengo ancora errori nel tentativo di individuare i file .ui.

PyInstaller: IOError: [Errno 2] No such file or directory:

# import relevant modules etc... 

cwd = os.getcwd() 
securitySearchForm = os.path.join(cwd, "securitySearchForm.ui") 
popboxForm = os.path.join(cwd, "popbox.ui") 

Ui_MainWindow, QtBaseClass = uic.loadUiType(securitySearchForm) 
Ui_PopBox, QtSubClass = uic.loadUiType(popboxForm) 

# remainder of code below. 

Sono consapevole del fatto che si può convertire i file in .py e importarli nella routine principale utilizzando pyuic4 .ui. Tuttavia, apporterò più modifiche ai file .ui e quindi non è possibile per me continuare a convertirli.

Esiste comunque una soluzione per poter creare un file .exe autonomo?

Sono abbastanza nuovo nell'usare PyQT4 e PyInstaller - qualsiasi aiuto sarebbe molto apprezzato!

risposta

7

Dopo essermi grattato la testa per tutto il fine settimana e guardare oltre SO, sono riuscito a compilare l'exe standalone come previsto usando i file dell'interfaccia utente.

In primo luogo, ho definito la seguente funzione utilizzando questa risposta

Bundling data files with PyInstaller (--onefile)

# Define function to import external files when using PyInstaller. 
def resource_path(relative_path): 
    """ Get absolute path to resource, works for dev and for PyInstaller """ 
    try: 
     # PyInstaller creates a temp folder and stores path in _MEIPASS 
     base_path = sys._MEIPASS 
    except Exception: 
     base_path = os.path.abspath(".") 

    return os.path.join(base_path, relative_path) 

Poi ho importato il file .ui utilizzando questa funzione e le variabili per le classi richieste.

# Import .ui forms for the GUI using function resource_path() 
securitySearchForm = resource_path("securitySearchForm.ui") 
popboxForm = resource_path("popbox.ui") 

Ui_MainWindow, QtBaseClass = uic.loadUiType(securitySearchForm) 
Ui_PopBox, QtSubClass = uic.loadUiType(popboxForm) 

Poi ho dovuto creare un file di risorse (.qrc) usando Qt Designer e inserire delle immagini/icone che utilizzano questo file di risorse. Una volta fatto, ho usato pyrcc4 per convertire il file .qrc in file .py, che sarebbe stato importato nello script principale.

Terminal

C:\Users\giranm\PycharmProjects\PyQt Tutorial>pyrcc4 -py3 resources.qrc -o resources_rc.py 

Python

import resources_rc 

Una volta mi hanno confermato la sceneggiatura .py principale funziona, ho quindi creato un file .spec utilizzando PyInstaller.

Terminal

C:\Users\giranm\PycharmProjects\PyQt Tutorial>pyi-makespec --noconsole --onefile secSearch_demo.py 

Come da manuale di PyInstaller, ho aggiunto i file di dati modificando il file .spec sopra.

https://pythonhosted.org/PyInstaller/spec-files.html#adding-data-files

Infine, ho poi compilato l'exe utilizzando il file .spec dall'alto.

Problemi correlati