Windows- Pyinstaller错误 "failed to execute script" 当应用程序被点击

62

我正在努力克服这个错误,我已经到处搜索了那个错误信息,但似乎没有任何与我的情况相关的内容:

"failed to execute script new-app" 

new-app是我的Python GUI程序。当我使用以下命令运行pyinstaller时:

pyinstaller.exe --onedir --hidden-import FileDialog --windowed --noupx new-app.py

它运行得非常流畅。此外,当我执行命令行运行GUI程序时,它可以完美地工作,并使用以下命令生成GUI:

它的工作非常顺畅。另外,在执行命令行来运行GUI程序时,它能够完美地工作,同时使用这个命令生成GUI:

.\dist\new-app\new-app.exe

当我打开文件并希望通过点击应用程序来获取GUI时,它会给出上述错误。为什么会这样呢?

我使用的是Python2.7,操作系统是Windows 7 Enterprise。

非常感谢您提供任何意见。

10个回答

90

嗯,我想我已经找到了解决自己问题的方法,这就是我是如何做到的:

虽然我能够成功地使用普通的Python命令运行程序,并且成功运行PyInstaller,还能够使用问题中提到的命令行执行应用程序“new_app.exe”,在这两种情况下都没有任何问题显示GUI。但是,只有当我点击应用程序时,它才不允许显示GUI,而且不会生成任何错误。

所以,我添加了一个额外的参数--debug在PyInstaller命令中,并删除了--windowed参数,这样当单击应用程序时,我就可以看到实际发生的情况,我发现存在一个错误,当我跟踪它时,它基本上抱怨说"some_image.jpg"不存在或无法打开

之所以会出现此错误而且从第一次运行脚本甚至使用命令行“./”时没有出现任何问题,是因为图像文件存在于与脚本位于同一路径的位置,但是当PyInstaller创建了“dist”目录,其中包含应用程序产品时,图像文件不在那里,所以我只需将其移动到该可单击应用程序所在的dist目录即可!

因此,简单的答案是将所有媒体文件或由代码使用的文件夹放置在可执行文件所在的目录中。

第二种方法是在PyInstaller命令中添加“--add-data <path to file/folder>”(这可以多次使用以添加不同的文件)选项,这将自动将给定的文件或文件夹放入exe文件夹中。


1
当双击文件时,资源管理器将工作目录设置为打开的目标文件所在的目录。但是,您的可执行文件可以在任何工作目录下运行,并且仍应能够相对于自身找到其所有数据。通常使用冻结程序的情况下,可以使用 os.path.dirname(sys.argv[0])os.path.dirname(sys.executable)。最好使用 os.path.join 创建数据文件的路径,但也可以通过 os.chdir 更改工作目录。 - Eryk Sun
这种方法很有帮助。谢谢。 - Jithin Pavithran
1
我不知道 --debug 选项。它对我的问题有很大帮助。所有的 PyInstaller 选项都可以在这里找到 (https://pyinstaller.readthedocs.io/en/stable/usage.html)。 - BigRed118
你是对的,当将TKinter程序转换为EXE文件时,对文件和文件夹的位置要求更加敏感。例如,程序期望在文件中存储数据时,应该在程序的开头(在函数定义之前)编写创建文件夹的代码,而不是在末尾。命令行程序(DOS)对此要求不太严格。 - undefined

10

在我的情况下,我有一个main.py文件,它依赖于其他文件。在使用以下命令对该应用程序进行py安装程序构建之后:

pyinstaller --onefile --windowed main.py

我在dist文件夹里找到了main.exe文件。我双击这个文件,并出现了上面提到的错误。 为了解决这个问题,我只需将main.exe从dist目录复制到先前的目录中,即我的main.py和依赖文件的根目录,然后运行main.exe后就不会出现错误。


1
我们需要更多关于您回复的细节。 - Hamed Baziyad
3
把“dist”文件夹中的exe文件移动到父文件夹。 - Pranit Bankar
1
@PranitBankar 是的!那正是我想表达的。谢谢。 - monti
你是否遇到了仅依赖文件或者依赖文件夹的问题? - Anna Madsen

9
请在您的脚本开头添加此功能:
import sys, os 
    def resource_path(relative_path):
        if hasattr(sys, '_MEIPASS'):
            return os.path.join(sys._MEIPASS, relative_path)
        return os.path.join(os.path.abspath("."), relative_path)

通过调用函数resource_path()来引用您的数据文件,就像这样:

resource_path('myimage.gif')

然后使用这个命令:

pyinstaller --onefile --windowed --add-data todo.ico;. script.py

欲知更多信息,请访问此文档页面


6
如果其他答案没有给出结果,我通过以下方式解决了类似的问题:
  1. 根据需要添加--hidden-import标志以获取任何缺失的模块

  2. 清理相关文件夹和spec文件:

rmdir /s /q dist

rmdir /s /q build

del /s /q my_service.spec

  1. 以管理员身份运行安装命令

6

我遇到了与此处列出的不同原因导致的错误,并且无法轻松地找到解决方案,所以我想在这里发布。

希望对某人有所帮助。

我的问题出在引用程序中的文件上。它找不到所列出的文件,因为我在编码时将要引用的文件放在顶层目录中,并仅调用了

"my_file.png"

当我调用文件时,pyinstaller并不支持这种操作。即使我从同一文件夹中运行它,它也需要完整的路径:

"C:\Files\my_file.png"

当我将所有路径更改为完整路径时,问题得到解决。


这正是我所面临的问题。我的pygame模块正在导入一些图像,而路径是相对于当前工作目录的。我只需将所有图像复制到形成exe的顶级目录中,问题就解决了。 - Manu S Pillai
如果我已经放置了绝对路径,您有任何想法问题可能是什么? - yem

4

我遇到了相同的错误,后来发现我的脚本是使用Anaconda编写的,但是pyinstaller试图在纯Python上打包脚本。因此,模块不存在于Python库文件夹中,导致了这个问题。


1

我遇到了类似的问题,这是因为我使用的是Anaconda,而不是在pip中安装依赖项。帮助我的方法是在pip中安装依赖项。


0
那个错误是由于pyinstaller缺少模块引起的。您可以通过在可执行命令行中运行脚本来查找缺少的模块,即通过从命令中删除“-w”。一旦您创建了命令行可执行文件,它将显示缺少的模块。通过找到这些缺少的模块,您可以将其添加到您的命令中: “--hidden-import = missingmodule”。 我通过这种方式解决了我的问题。

0

我找到了一个类似的问题,但上面的答案都没有帮助。我找到了一个解决方案,激活基本环境来解决我的问题。在没有基本环境的情况下再次尝试我正在做的事情,我成功执行了GUI.exe

正如@Shyrtle所述,鉴于我解决了最初的问题后我想添加一个背景图像,即使file.py和图像本身位于同一目录中,我也必须传递整个图像的路径。


0
在我的情况下(新手级别),我忘记安装“matplotlib”库。程序在Pycharm中可以工作,但是当我尝试从终端打开时却无法工作。在主目录中安装了该库后一切正常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接