Изображение Pyinstaller не загружается

Проблема

Я пытаюсь превратить файл python в EXE файл, однако я, кажется, сталкиваюсь с одной и той же проблемой каждый раз, будь то CX_Freeze или Pyinstaller. Я просто попытался использовать pyinstaller, и я сделал EXE файл, используя команду

pyinstaller --onefile thepyfile

и все работает отлично. Он создает exe в файле dist. Однако, когда я открываю exe, он показывает мне окно команд, а затем быстро отключается. Мне удалось захватить ошибку, полученную с помощью экрана печати, и он сказал: Ошибка pygame: Не удалось открыть изображение family.jpg. Я использую модуль pygame.

Что я пробовал?

Iv убедился, что изображения находятся в одном каталоге и в той же папке, что и мой файл python. Моя .py отлично работает, когда я запускаю ее, это просто exe. В любом случае, просто чтобы убедиться, что нет проблем с загрузкой изображений в пути, к которому я присоединился к пути, используя

os.path.join

Снова он работал для файла py, но он не работал в exe. Я также проверил, правильно ли я установил pyinstaller, и он работает для других exe-программ, которые не включают импорт изображений. Я также попытался создать папку, а затем использовать

os.path.join(folder,file)

но опять же он работал в файле py, но не с pyinstaller/cx_freeze exe.

Ключ?

Пока я работал с CX__freeze, я обнаружил, что pygame не может импортировать изображение. Однако это дало мне больший случай с ошибкой, но не уверен, полезно ли это, но может быть ключом?

введите описание изображения здесь

Пожалуйста, помогите

Iv столкнулся с этой проблемой уже более 5 недель и отчаянно нуждается в помощи.

Некоторый код

Вот как я импортирую изображение (снова работает в файле py, но не exe)

family_image = pygame.image.load(os.path.join('folder',"family.jpg")).convert()

И если это необходимо, мой cx_Freeze setup.py, который также делает exe файл еще, дает мне изображение, которое может быть загружено ошибкой.

import cx_Freeze
import sys
import pygame
import random
import math
import os
os.environ['TCL_LIBRARY'] = "C:\\Program Files\\Python35\\tcl\\tc18.6"
os.environ['TK_LIBRARY'] = "C:\\Program Files\\Python35\\tcl\\tk8.6"


base = None

if sys.platform == 'win32':
    base = "Win32GUI"





executables = [cx_Freeze.Executable("Treg&Shelly.py",shortcutName="Cards",shortcutDir="DesktopFolder",base = base)]

cx_Freeze.setup(
    name = "HAPPY NEW YEARS",
    options = {"build_exe":{"packages":["pygame","random","math"],"excludes" : ['tcl','ttk','tkinter','Tkinter'],"include_files":["family.jpg","newyears.png"]}},
    version = "0.01",
    description = "New Years Card",
    executables = executables

    )

Примечание

Все мои изображения находятся в отдельной папке, но доступны моему файлу python.

Также я использую python 3.5

Спасибо за любой ответ

Ответ 1

Вы можете использовать py2exe для преобразования python в исполняемый файл. Этот подход до сих пор работал у меня.

pte.py - это файл script в C:\Python\toexe>

  • Перейдите к C:\Python\toexe>
  • Поместите файл xxx.py python в тот же каталог
  • Отредактируйте файл pte.py, как показано ниже:

    ------------------------------------------

    из настройки импорта distutils.core

    import py2exe

    setup (console = ['xxx.py']) ## для программ CLI

    setup (windows = ['xxx.py']) ### для gui

    ------------------------------------------

  • Выполните следующую команду: C:\Python\toexe> pte.py py2exe

Ответ 2

Глядя на строку:

options = {"build_exe":{"packages":["pygame","random","math"],"excludes" : ['tcl','ttk','tkinter','Tkinter'],"include_files":["family.jpg","newyears.png"]}},

Рассмотрим:

All my images are in a separate folder

В разделе include_files указывается два файла в базовом каталоге, а не в отдельной папке.

Попробуйте что-то вроде:

options = {"build_exe":{"packages":["pygame","random","math"],"excludes" : ['tcl','ttk','tkinter','Tkinter'],"include_files":[os.path.join("imageDir", "family.jpg"),os.path.join("imageDir","newyears.png")]}},

В частности, это поместит файлы в базовый каталог. Рассмотрите возможность предоставления кортежа (ввода, вывода) для каждого файла, а не только ввода, чтобы указать, куда именно вы хотите, чтобы эти файлы уходили.

options = {"build_exe":{"packages":["pygame","random","math"],"excludes" : ['tcl','ttk','tkinter','Tkinter'],"include_files":[(os.path.join("imageDir", "family.jpg"), os.path.join("imageDir", "family.jpg")),(os.path.join("imageDir","newyears.png"),os.path.join("imageDir","newyears.png"))]}},

Ответ 3

Если сборка pyinstaller работает, если вы создаете пакет из одной папки (удалите параметр --onefile), проблема, вероятно, такова:

Когда вы запускаете пакет из одного файла, создается временная структура папки. Имя временной папки создается во время выполнения и неизвестно, когда вы ее связываете. Поэтому путь неизвестен.

Однако Pyinstaller добавляет атрибут sys._MEIPASS, который содержит абсолютный путь к временной папке. Итак, попробуйте что-то вроде:

if getattr(sys, 'frozen', False):
    wd = sys._MEIPASS
else:
    wd = ''    
family_image = pygame.image.load(os.path.join(wd,'folder',"family.jpg")).convert()

Также см. ther Документ Pyinstaller.

Ответ 4

Поскольку ваша замороженная программа не знает, в какой папке она есть, вы должны использовать os.getcwd():

python_powered = pygame.image.load(os.path.join(os.getcwd(),'images',"family.jpg")).conve‌​rt()

Не забудьте не забыть import os

Ответ 5

просто введите pip install pygame в подсказку cmd о местоположении файла python. Я надеюсь, что это помогло!