#python #python-3.x #pygame #pyinstaller
Вопрос:
Ниже приведен файл game.spec, который я создал. При выполнении приведенной ниже команды приложение создается идеально
pyinstaller --onefile game.spec
При работе с игрой она не может найти ни один из файлов данных. При дальнейшем исследовании выяснилось, что он ищет все файлы данных в каталоге /Пользователи/имя пользователя, а не по абсолютному пути, по которому запускается программа.
Должен ли файл спецификации быть написан по-другому?
# -*- mode: python ; coding: utf-8 -*- block_cipher = None a = Analysis(['game.py'], pathex=['/Users/username/pythonenv/mygame'], binaries=[], datas=[('images','images'), ('fonts','fonts'), ('sounds','sounds'), ('pygame','pygame'), ('pygameMenu','pygameMenu'), ('pgzero','pgzero'), ('numpy','numpy'), ('pgzrun.py','.')], hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, [], exclude_binaries=True, name='game', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, console=False ) coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, upx_exclude=[], name='game') app = BUNDLE(coll, name='game.app', icon=None, bundle_identifier=None)
Ответ №1:
Когда PyInstaller (или cx_Freeze, py2exe и т. Д.) Создает исполняемый файл, Все программные файлы вместе с PyGame, Python и кучей других материалов сжимаются.
Когда он запускается, первое, что происходит, — это распаковка архива материалов. Где-то распаковали. Затем запускается ваш исполняемый файл, но не из места распаковки.
Чтобы исправить это, ваш сценарий должен определить местоположение, из которого он выполняется, — это полный путь к сценарию. Затем используйте это расположение, чтобы найти все дополнительные файлы программы.
import sys import os.path if getattr(sys, 'frozen', False): EXE_LOCATION = os.path.dirname( sys.executable ) # cx_Freeze frozen else: EXE_LOCATION = os.path.dirname( os.path.realpath( __file__ ) ) # Other packers
Затем при загрузке файла определите полный путь с помощью os.path.join
:
my_image_filename = os.path.join( EXE_LOCATION, "images", "xenomorph.png" ) image = pygame.image.load( my_image_filename ).convert_alpha() my_sound_filename = os.path.join( EXE_LOCATION, "sounds", "meep-meep.ogg" ) meep_sound = pygame.mixer.Sound( my_sound_filename )
Возможно, можно использовать os.chdir( EXE_LOCATION )
для установки каталога один раз и, таким образом, вносить меньше изменений, но я думаю, что лучший подход-быть осторожным с путями.
Комментарии:
1. Спасибо @Kingsley, это решило проблему с ресурсами