Pyinstaller和--onefile:如何在exe文件中包含图像

Nau*_*ius 9 python pyinstaller

我使用Pyinstaller创建了一个exe文件.

pyinstaller.exe --onefile --icon='Loco.ico program.py
Run Code Online (Sandbox Code Playgroud)

在程序中,我在我的图中包含一个图像,当我在其文件夹中单独运行程序时,我得到以下内容:

IOError: [Errno 2] No such file or directory: 'Logo.png'
Run Code Online (Sandbox Code Playgroud)

一种解决方案是将图像包含在exe文件夹中,如下面的链接所示:

pyinstaller不显示图像和图标

但是再一次--onefile的全部意义就是拥有它,不需要另外的图像.我认为解决方案可能在这个链接中,但我还没有理解.

使用PyInstaller捆绑数据文件(--onefile)

我的spec文件看起来如下:

# -*- mode: python -*-
a = Analysis(['AMOS_Visualizer.py'],
    pathex=['C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting'],
    hiddenimports=[],
    hookspath=None,
    runtime_hooks=None)

pyz = PYZ(a.pure)
exe = EXE(pyz,
      a.scripts,
      a.binaries,
      a.zipfiles,
      a.datas,
      name='AMOS_Visualizer.exe',
      debug=False,
      strip=None,
      upx=True,
      console=True , icon='AMOS.ico')
Run Code Online (Sandbox Code Playgroud)

Rai*_*ann 22

清晰明确的指南

尽管网上有解释,我还是花了几个小时才想出了一个独立的应用程序,它包含多个图像,执行时不会打开控制台窗口,并且仅合并在一个文件中。这是我的解决方案,至少适用于 Mac OS:

第 1 步:更改目录

更改为可执行文件的目录:

cd PATH_OF_YOUR_FILE
Run Code Online (Sandbox Code Playgroud)

确保程序所需的图像也位于包含要使其可执行的 Python 文件的文件夹中。

第 2 步:将代码添加到您的 Python 文件中

将以下内容添加到要使其可执行的 Python 文件中:

import os

def resource_path(relative_path):
    try:
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)
Run Code Online (Sandbox Code Playgroud)

将文件名替换为resource_path("FILENAME").

例子:

image1 = Image.open("image.png")

# to:

image1 = Image.open(resource_path("image.png"))
Run Code Online (Sandbox Code Playgroud)

第 3 步:创建可执行文件

现在运行以下代码(替换图像名称和文件名):

pyinstaller --onefile --windowed --add-data "picture1.jpeg:." --add-data "picture2.png:." your_file.py
Run Code Online (Sandbox Code Playgroud)

注意:可以添加任意数量的图像。

说明:

--onefile:创建一个单文件捆绑可执行文件。同义词:-F

--windowed:确保执行期间没有打开控制台。同义词:-w--noconsole

你完成了!

应用程序现在位于该dist目录中,该目录与 Python 文件位于同一目录中。

现在应该可以将其拖到另一台 Mac 上,并在通过 启用后在那里运行它Settings -> Security & Privacy

我希望这对你有帮助。享受结果,喝杯茶然后坐下来。

  • 对于 Windows 需要将 ```picture1.jpeg:.``` 更改为 ```picture1.jpeg;.``` (14认同)

Nau*_*ius 11

编辑:

我相信我找到了解决问题的方法.

# -*- mode: python -*-
a = Analysis(['AMOS_Visualizer.py'],
         pathex=['C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting'],
         hiddenimports=[],
         hookspath=None,
         runtime_hooks=None)

for d in a.datas:
    if 'pyconfig' in d[0]:
        a.datas.remove(d)
        break

a.datas += [('Logo.png','C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting\\Logo.png', 'Data')]
pyz = PYZ(a.pure)
exe = EXE(pyz,
      a.scripts,
      a.binaries,
      a.zipfiles,
      a.datas,
      name='AMOS_Visualizer.exe',
      debug=False,
      strip=None,
      upx=True,
      console=True, icon='C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting\\AMOS.ico')
Run Code Online (Sandbox Code Playgroud)

并将以下内容添加到我的main.py脚本中

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)

Logo = resource_path("Logo.png")
Run Code Online (Sandbox Code Playgroud)


小智 11

为此苦苦挣扎。要知道的关键是,对于 --onefile 构建,您的图像将存储在 sys._MEIPASS 文件夹中。

我的 tkinter 应用程序中的这行代码破坏了我的 .exe:

self.wm_iconbitmap("favicon.ico")
Run Code Online (Sandbox Code Playgroud)

为了修复它,我将其替换为:

self.wm_iconbitmap(get_path("favicon.ico"))
Run Code Online (Sandbox Code Playgroud)

其中 get_path() 是我添加到模块中的一个小函数:

def get_path(filename):
    if hasattr(sys, "_MEIPASS"):
        return os.path.join(sys._MEIPASS, filename)
    else:
        return filename
Run Code Online (Sandbox Code Playgroud)

对于上下文,我在 CLI 中运行此命令来构建 .exe:

pyinstaller --noconfirm --onefile --windowed --add-data "C:/Users/[...]/favicon.ico;."  "C:/Users/[...]/main.py"
Run Code Online (Sandbox Code Playgroud)

注意,这是在 Win10 上运行的。

感谢许多其他 Stack Overflow 贡献者来到这里。

  • 这是正确的答案。目前接受的那个对我不起作用。 (3认同)

Die*_*ego 7

如果您使用的是 Qt Designer,则可以通过创建资源文件并将所需的所有图像(包括 Logo.png)添加到该资源中来实现。

要创建资源文件,您可以按照使用 QT Designer 在 GUI 中插入图像中的步骤进行操作。

将图像插入资源文件后,将 Logo.png 分配给 Window 图标,保存 QtDesigner 界面并使用以下命令转换资源文件:pyrcc4 -py3 resourcetest.qrc -o resourcetest_rc.py

最后,使用--onefile选项创建exe文件。无需编辑规格文件。


2di*_*com 5

这是以下内容的变体: 使用 PyInstaller (--onefile) 捆绑数据文件,并且给出的答案更清晰。

分两行:

  1. 您必须将图像文件添加到“datas”中(在规范文件中或使用 PyInstaller 挂钩脚本)
  2. 使用 sys._MEIPASS(如果存在),
    使用单行base_path = getattr(sys, '_MEIPASS', '.')+'/'获取“root_path”变量以连接到所有文件的路径。
    然后,filepath = base_path + filepath