Pyinstaller Не может получить доступ к папке с данными

#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, это решило проблему с ресурсами