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

#python #pygame

#python #pygame #pgzero

Вопрос:

Ниже приведен файл game.spec, который я создал. При выполнении приведенной ниже команды приложение создается идеально

 pyinstaller --onefile game.spec
  

При запуске игры он не может найти ни один из файлов данных. При дальнейшем исследовании было обнаружено, что он ищет все файлы данных в каталоге / Users / username, а не по абсолютному пути, по которому запускается программа.

Нужно ли писать файл спецификации по-другому?

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