当前位置: 首页 > 面试题库 >

PyInstaller + UI文件-FileNotFoundError:[Errno 2]没有这样的文件或目录:

洪光霁
2023-03-14
问题内容

我正在尝试使用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文件时仍然出现错误。

# 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相当陌生-任何帮助将不胜感激!


问题答案:

整个周末都head不休,然后进一步研究SO之后,我设法使用UI文件按预期方式编译了独立的.exe。

首先,我用这个答案定义了以下函数

使用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
Designer创建资源文件(.qrc),并使用该资源文件嵌入图像/图标。完成后,我使用pyrcc4将.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。



 类似资料:
  • 我正试图用python中的pd.read_excel读取我的excel文件。但是ıam得到这个错误消息=FileNotFoundError:[Errno 2]没有这样的文件或目录 我把我的excel文件和python文件放在同一个地方。图1图2

  • 问题内容: 我在Windows中使用Code :: Blocks。 我创建了一个dll项目,试图获得一些JNI实践。 在javah生成的.h文件中,有#include jni.h,但是当我尝试对其进行编译时,它总是说jni.h:没有这样的文件或目录。 我认为这与classpath有关,但我不知道它是什么!可能是我必须更改Code :: Blocks的设置 有人可以帮我解决这个问题吗?非常感谢 编辑

  • 问题内容: 我从节点应用程序收到此错误: 我知道文件在那里,因为当我尝试使用确切的复制和粘贴路径打开文件时,它可以工作。我也知道应用程序使用的是正确的目录,因为它会在错误中输出它。 问题答案: 波浪形扩展是一件空壳的事情。编写正确的路径名(可能是yourusername )或使用

  • 问题内容: 我最近在运行Ubuntu 12.04 LTS的Macbook Pro上安装了用于C ++开发的KDevelop 4。 我想在我的C ++代码中嵌入Python应用程序。为此,需要包含Python.h头文件。所以,我做到了。 但是,在运行时,我从IDE收到以下响应: 但是,我很快就发现了问题。我还没有下载python- dev软件包。所以,我做到了。我又跑了一次,但同样的错误又出现了。因

  • 问题内容: 我在运行docker文件时收到来自docker的错误消息。就是说/ var / lib / docker / aufs / layers / xxxx:运行Docker build时没有这样的文件或目录。 我尝试了多种方法来删除容器和图像,因此我对此非常有兴趣。 任何 Docker文件为: 完整的控制台输出为: 编辑 @BMitchs的建议解决了该问题: rm -rf / var /