Я хочу сделать .py файл в исполняемый файл с помощью pyinstaller - PullRequest
0 голосов
/ 28 декабря 2018


Я делаю программу с помощью pygame и хочу превратить ее в исполняемый файл.
Программа будет работать правильно, если это скрипт на python.
Но возникла проблема, если я попробуючтобы сделать его исполняемым файлом.
Я создал файл спецификации, показанный ниже, и запустил его, чтобы объединить все зависимости в исполняемый файл.
Наконец, я мог создать исполняемый файл, однако он не запустился с отображением сообщений об ошибках, как показано ниже.

↓ Сообщения об ошибках, которые я получил (там говорится, что папка с именем «resources» не существует! Но я создал виртуальную папку.)
https://imgur.com/sq67mil

Как это исправитьпроблема?

(я ссылался на этот документ https://pyinstaller.readthedocs.io/en/v3.3.1/spec-files.html)

версия PyInstaller: 3.3.1
версия Python: 3.6.6

↓ мой скрипт на python

#pygame_test.py located at Desktop/RPG_test
import pygame,sys,os
print(os.getcwd())
class Player(pygame.sprite.Sprite):
    def __init__(self,image_path,root):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(image_path).convert_alpha()
        self.rect = self.image.get_rect()

    def update(self):
        self.rect.centerx = pygame.mouse.get_pos()[0]
        self.rect.centery = pygame.mouse.get_pos()[1]

def main():
    pygame.init()
    root = pygame.display.set_mode((400,400))
    running = True
    player = Player("resources/tiger_window.png",root)
    group = pygame.sprite.Group()
    group.add(player)
    fps = 30
    clock = pygame.time.Clock()
    while running:
        clock.tick(fps)
        root.fill((50,150,200))
        group.update()
        group.draw(root)
        pygame.display.update()
        for event in pygame.event.get():
            if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
                running = False
                pygame.quit()
                sys.exit()
        pygame.event.clear()
if __name__ == "__main__":
    main()

↓ файл спецификации, который я создал командой "pyi-makepec".

# -*- mode: python -*-
block_cipher = None
a = Analysis(['pygame_test.py'],
         pathex=['C:\\Users\\Ayata\\Desktop\\RPG_test'],
         binaries=[],
         datas=[("C:/Users/Ayata/Desktop/RPG_test/resources/tiger_window.png","resources")],
         hiddenimports=[],
         hookspath=[],
         runtime_hooks=[],
         excludes=[],
         win_no_prefer_redirects=False,
         win_private_assemblies=False,
         cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
         cipher=block_cipher)
exe = EXE(pyz,
      a.scripts,
      a.binaries,
      a.zipfiles,
      a.datas,
      name='pygame_test',
      debug=False,
      strip=False,
      upx=True,
      runtime_tmpdir=None,
      console=True )

1 Ответ

0 голосов
/ 29 декабря 2018

Одна из первых вещей, которая происходит после запуска однофайлового исполняемого файла, созданного PyInstaller, заключается в том, что создается временный каталог .Затем исполняемый файл распаковывает кучу файлов ресурсов в этот каталог, а также файлы пользовательских данных (например, ваш tiger_window.png файл).В ваших сценариях вы можете получить путь к этому каталогу из переменной sys._MEIPASS.

Следующий фрагмент кода должен предоставить правильный путь к файлу изображения как в режиме «разработки», так и в «замороженном» режиме:

try:
    # Get temporary directory created by PyInstaller single-file executable
    base_path = sys._MEIPASS
except AttributeError:
    # Get directory in which this script file resides
    base_path = os.path.dirname(os.path.realpath(__file__))

# Get path to image file
img_path = os.path.join(base_path, 'resources/tiger_window.png')

Альтернативное решение

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

...