Pyinstaller вставляет папку изображений в --onefile - оконное приложение - PullRequest
1 голос
/ 01 октября 2019

Я пытаюсь встроить папку с изображениями в сгенерированный (с PyInstaller) исполняемый файл. Но это не работает для меня. Даже с одним простым изображением!

Переменная datas в моем файле main.spec выглядит следующим образом:

datas=[ ('C:\\Users\\<user>\\dir1\\dir2\\MyApp\\images\\myicon.png', 'images') ],

В соответствии с документацией:

Первая строка указывает файл или файлы, которые находятся сейчас в этой системе. Второй указывает имя папки для хранения файлов во время выполнения.

В файле python я читаю изображение так:

self.SetIcon(wx.Icon("images\\myicon.png"))

Наконец, этокак я упаковываю все в * .exe с помощью PyInstaller:

pyinstaller --onefile --windowed --icon=images\main32x32.ico main.spec

Я получаю следующую ошибку:

Failed to load image from file "images\myicon.png"

Может кто-нибудь сказать мне, что я делаю неправильно?

1 Ответ

3 голосов
/ 02 октября 2019

Если вы хотите встроить файл в свой исполняемый файл, вам нужно сделать две вещи:

Сначала добавьте его с add-data в свой исполняемый файл (как вы уже сделали). Затем загрузите файл из извлеченного пути во время выполнения.

Здесь вы загружаете файл в images\\myicon.png, который является путем рядом с вашим исполняемым файлом, но файла там нет. Файлы времени выполнения будут извлечены во временный каталог, например, C:/Users/<user>/AppData/Local/Temp/_MEIXXX и должны быть загружены из этого каталога.

Вы можете использовать sys._MEIPASS, чтобы получить временный путь, где извлеченные файлырасположены. Вы также можете создать функцию для загрузки файлов:

import os
import sys


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)


self.SetIcon(wx.Icon(resource_path("images/myicon.png")))
...