2016-06-17 95 views
7

我试图导出我的.py脚本.exe使用PyInstaller,它依赖于使用Qt设计器创建的.ui文件。PyInstaller + UI文件 - FileNotFoundError:[Errno 2]没有这样的文件或目录:

我可以确认我的.py脚本在通过PyCharm运行时工作得很好 - 我可以看到我用.ui文件创建的GUI。

然而,当我导出我的.py脚本.exe和启动它,我收到以下错误,在命令行:

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 

出于某种原因,该.exe文件寻找.ui文件在路径 - C:\ Users \ giranm \

但是,已经做了一些研究,我被告知我需要使用os.getcwd()并确保我的脚本中有完整的路径。即使使用下面的代码,我仍然遇到错误,试图找到.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. 

我知道,一个可以转换的.ui文件的.py和使用pyuic4它们导入到主程序。但是,我将对.ui文件 进行多次编辑,因此我不可能继续转换它们。

有无论如何解决这个问题,以便我可以创建一个独立的.exe?

我对使用PyQT4和PyInstaller相当陌生 - 任何帮助将不胜感激!

回答

7

在整个周末抓住我的脑袋并进一步探索之后,我设法使用UI文件编译独立的.exe。

首先,我用这个答案

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) 

接下来我进口使用此函数和变量为所需的类.UI文件中定义了下面的函数。

# 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) 

我只好再创建一个使用Qt设计和使用该资源文件中嵌入图片/图标的资源文件(.qrc)。完成后,我使用pyrcc4将.qrc文件转换为.py文件,该文件将在主脚本中导入。

终端

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

的Python

import resources_rc 

一次,我已经确认了主要的.py脚本工作,然后,我创建使用PyInstaller一个的.spec文件。

终端

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

按PyInstaller的指南,我已经通过修改上面的.spec文件添加的数据文件。

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

最后,我再编译使用的.spec文件从上面的.exe文件。

相关问题