Windows-Pyinstaller 错误“无法执行脚本”当应用程序单击时

Posted

技术标签:

【中文标题】Windows-Pyinstaller 错误“无法执行脚本”当应用程序单击时【英文标题】:Windows- Pyinstaller Error "failed to execute script " When App Clicked 【发布时间】:2017-04-04 14:56:12 【问题描述】:

我很难克服这个错误,我到处搜索该错误消息,但似乎与我的情况无关:

"failed to execute script new-app" 

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

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

它运行顺利。另外,当我执行命令行运行 gui 程序时,它运行良好,并且使用此命令生成 GUI:

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

但是当我希望能够单击应用程序以获取 GUI 时转到该文件时,它给了我上面所说的错误。这是为什么呢?

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

任何意见将不胜感激,并提前非常感谢。

【问题讨论】:

【参考方案1】:

好吧,我想我已经找到了解决我自己问题的方法,我是这样做的:

即使我能够使用普通 python 命令成功运行程序,也能够成功运行 pyinstaller,并且能够使用问题中提到的命令行执行应用程序“new_app.exe”,这两种情况下都显示 GUI完全没有问题。但是,只有当我单击应用程序时,它才允许显示 GUI,并且不会产生错误。

所以,我所做的是我在 pyinstaller 命令中添加了一个额外的参数 --debug 并删除了 --windowed 参数,以便我可以看到单击应用程序时实际发生的情况,我发现有一个错误当我跟踪它时,这很有意义,它基本上抱怨 "some_image.jpg" 没有这样的文件或目录

当我从一开始运行脚本甚至使用命令行“./”时它抱怨并且没有抱怨的原因是因为文件图像存在于与脚本相同的路径中,但是当 pyinstaller 创建时包含应用程序产品的“dist”目录很清楚图像文件不存在,所以我基本上将它移到了可点击应用程序所在的dist目录!

所以简单的答案是将代码使用的所有媒体文件或文件夹放在 exe 文件所在的目录中。

第二种方法是在pyinstaller命令中添加“--add-data ”(可以多次添加不同的文件)选项,这将自动放置给定的文件或文件夹进入exe文件夹。

【讨论】:

Explorer 将工作目录设置为双击文件时打开的目标文件的工作目录。但是您的可执行文件可以在任何工作目录中运行,并且它应该仍然能够找到与其自身相关的所有数据。通常使用 os.path.dirname(sys.argv[0])os.path.dirname(sys.executable) 的冻结程序。最好使用os.path.join 为您的数据文件创建路径,但您也可以通过os.chdir 更改工作目录。 这种方法很有帮助。谢谢。 我不知道 --debug 选项。这对我的问题有很大帮助。所有 pyinstaller 选项都可以在这里找到 (pyinstaller.readthedocs.io/en/stable/usage.html)。【参考方案2】:

在我的例子中,我有一个 main.py,它与其他文件有依赖关系。在我使用以下命令使用 py 安装程序构建该应用程序后:

pyinstaller --onefile --windowed main.py

我在 dist 文件夹中找到了 main.exe。我双击这个文件,我提出了上面提到的错误。 为了解决这个问题,我只是将 main.exe 从 dist 目录复制到上一个目录,这是我的 main.py 和依赖文件的根目录,运行 main.exe 后没有错误。

【讨论】:

我们需要有关您的回复的更多详细信息。 @hamedbaziyad 只需将 exe 文件从“dist”文件夹移动到“dist”文件夹的父级。 @PranitBankar 是的!这实际上就是我的意思。谢谢。【参考方案3】:

在脚本开头添加此函数:

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

欲了解更多信息,请访问documentation page。

【讨论】:

【参考方案4】:

如果有人没有从其他答案中得到结果,我通过以下方式解决了类似的问题:

    根据需要为任何缺少的模块添加 --hidden-import 标志

    清理相关文件夹和规范文件:

rmdir /s /q dist

rmdir /s /q build

del /s /q my_service.spec

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

【讨论】:

【参考方案5】:

我收到此错误的原因与此处列出的原因不同,并且无法轻松找到解决方案,所以我想我会在此处发布。

希望这对某人有所帮助。

我的问题是在程序中引用文件。它无法找到列出的文件,因为当我对其进行编码时,我在***目录中有我想要引用的文件并且只是调用了

"my_file.png"

当我调用文件时。

pyinstaller 不喜欢这样,因为即使我从同一个文件夹运行它,它也需要一个完整路径:

"C:\Files\my_file.png"

一旦我将所有路径更改为完整版本的路径,它就解决了这个问题。

【讨论】:

这正是我也面临的问题。我的 pygame 模块正在导入一些图像,并且路径是相对于当前工作目录的。我只是将所有图像复制到形成 exe 的***目录并解决了问题。 如果我已经放置了绝对路径,您知道会出现什么问题吗?【参考方案6】:

我遇到了同样的错误,并发现我使用 Anaconda 编写了我的脚本,但 pyinstaller 试图在纯 python 上打包脚本。因此,pythons 库文件夹中不存在模块会导致此问题。

【讨论】:

【参考方案7】:

该错误是由于 pyinstaller 中缺少模块造成的。您可以通过在可执行命令行中运行脚本来查找丢失的模块,即从命令中删除“-w”。创建命令行可执行文件后,它将在命令行中显示缺少的模块。通过查找那些缺少的模块,您可以将其添加到您的命令中: " --hidden-import = 缺失模块 "

我通过这个解决了我的问题。

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

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

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

【讨论】:

【参考方案10】:

就我而言(菜鸟级别),我忘记安装库“matplotlib”。程序在 Pycharm 中工作,但当我尝试从终端打开时却没有。在主目录中安装库后一切正常。

【讨论】:

以上是关于Windows-Pyinstaller 错误“无法执行脚本”当应用程序单击时的主要内容,如果未能解决你的问题,请参考以下文章

您指定的网页无法访问! 错误类型:403

KernelBase.dll出现错误,无法解决

Win7无法启动服务错误1068怎么办?

您指定的网页无法访问 错误类型500是啥意思?

MongoDB服务无法启动,发生服务特定错误:100

错误安装 streamlit 它说“错误:无法为使用 PEP 517 且无法直接安装的 pyarrow 构建***”