我正在尝试使用pyinstaller将.py脚本导出到.exe,它依赖于使用qt designer创建的.ui文件。
我可以确认我的.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文件正在路径-c:\users\giranm中查找.ui文件\
但是,在做了一些研究之后,我被告知我需要使用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还比较陌生,如果有任何帮助,我将不胜感激!

最佳答案

整个周末我都抓耳挠腮,继续往下看,我设法使用UI文件按照预期编译了standalone.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),并使用这个资源文件嵌入图像/图标。完成后,我使用pyrc4将.qrc文件转换为.py文件,该文件将导入到主脚本中。
终点站
C:\Users\giranm\PycharmProjects\PyQt Tutorial>pyrcc4 -py3 resources.qrc -o resources_rc.py

蟒蛇
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。

07-28 02:45
查看更多