Изображение 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")).convert()
Не забудьте не забыть import os
Ответ 5
просто введите pip install pygame в подсказку cmd о местоположении файла python. Я надеюсь, что это помогло!