Не удается создать .exe с python kivy в Windows (Pyinstaller)

Итак, я пытаюсь сделать .exe из кода Python kivy, .exe создается, но не открывается. Ни сообщения, ничего. Я проверяю журналы, но там нет проблем, так что я в полном неведении. Я использую следующие .spec

# -*- mode: python -*-

block_cipher = None
from kivy_deps import sdl2, glew, gstreamer
spec_root = os.path.abspath(SPECPATH)
app_name = 'Gameficacao'

a = Analysis(['C:/Users/Artur/PycharmProjects/gameficacao/Gameficacao.py'],
             pathex=[spec_root],
             datas=[('C:/Users/Artur/PycharmProjects/gameficacao/*.kv', '.'), ('C:/Users/Artur/PycharmProjects/gameficacao/img/*.png', './img'),('C:/Users/Artur/PycharmProjects/gameficacao/font/*.ttf', './font'),('C:/Users/Artur/PycharmProjects/gameficacao/som/*.mp3', './som')],
             hiddenimports=['win32timezone'],
             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=app_name,
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=False,
          console=False)
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               *[Tree(p)
for p in (sdl2.dep_bins + glew.dep_bins +  gstreamer.dep_bins)],
               strip=False,
               upx=False,
               name=app_name)

Если у вас, ребята, есть что-нибудь, что может мне помочь (ЧТО-НИБУДЬ), пожалуйста, дайте мне знать.


person Gevezo    schedule 21.06.2020    source источник
comment
Рассмотрите возможность программирования на каком-нибудь другом языке программирования, возможно, на C ++11; с помощью GCC вы можете получить исполняемый файл из кода C++. В противном случае прочтите документацию по Python.   -  person Basile Starynkevitch    schedule 21.06.2020
comment
Это не вариант, к сожалению. Код Python готов, и на его создание ушло некоторое время.   -  person Gevezo    schedule 21.06.2020
comment
Чтение документации Python должно оставаться вариантом   -  person Basile Starynkevitch    schedule 21.06.2020


Ответы (2)


Итак, я понял это. ПРЕЖДЕ ВСЕГО, если у вас возникла эта проблема, вам нужно сначала добавить в свой код следующую строку:

def reset():
    import kivy.core.window as window
    from kivy.base import EventLoop
    if not EventLoop.event_listeners:
        from kivy.cache import Cache
        window.Window = window.core_select_lib('window', window.window_impl, True)
        Cache.print_usage()
        for cat in Cache._categories:
            Cache._objects[cat] = {}

if __name__ == '__main__':
    reset()
    'your app name here'().run()

Это предотвратит открытие приложения (например, когда оно выглядит как загрузка, но ничего не открывается). ПОСЛЕ ЭТОГО вы хотите построить, используя следующую спецификацию:

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None
from kivy_deps import sdl2, glew, gstreamer


a = Analysis(['C:\\Users\\Artur\\PycharmProjects\\gameficacao\\Gameficacao.py'],
             pathex=['C:\\Users\\Artur\\Desktop\\Trabalho\\Gameficacao'],
             binaries=[],
             datas=[('C:/Users/Artur/PycharmProjects/gameficacao/*.kv', '.'), ('C:/Users/Artur/PycharmProjects/gameficacao/img/*.png', './img'),('C:/Users/Artur/PycharmProjects/gameficacao/font/*.ttf', './font'),('C:/Users/Artur/PycharmProjects/gameficacao/som/*.mp3', './som')],
             hiddenimports=['pkg_resources.py2_warn','win32timezone','six','packaging','packaging.version','webbrowser','kivy','enchant'],
             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='Gameficacao',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins +  gstreamer.dep_bins)],
               strip=False,
               upx=True,
               upx_exclude=[],
               name='Gameficacao')

Теперь некоторые вещи здесь ОЧЕНЬ ВАЖНЫ, и приложение, вероятно, не будет работать без них, а именно:

  1. Строка от kivy_deps import sdl2, glew, gstreamer, прямо вверху
  2. Заполнение части данных анализа, здесь вам нужно будет указать путь к каждому файлу, который вы будете использовать в своем приложении, включая файл kivy. Используйте мою в качестве примера.
  3. Строка hiddenimports, здесь вы указываете каждый импорт, который имеет отношение к вашему приложению и который PyInstaller не может сделать. Для начала вы, вероятно, захотите поместить 'pkg_resources.py2_warn', так как PyInstaller не может правильно импортировать его, и он вам понадобится.
  4. Строка *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins + gstreamer.dep_bins)], будет дополнением к импорту, сделанному в начале кода.

Это решило проблему для меня.

person Gevezo    schedule 03.07.2020

Чтобы преобразовать файл .py в .exe, вы можете использовать модуль cx_freeze. Чтобы установить его, откройте cmd и введите pip install cx_freeze после его установки, создайте новый файл .py и добавьте приведенный ниже код.

        from cx_Freeze import setup, Executable
        setup(name = "<anyname>",
              version = "<any version>",
              description = "<add description you want>",
              executables = [Executable(r"<give the path where your python file is  
              located> ")]
              )

сохраните этот файл как setup.py или любое имя, которое вы хотите сохранить, и сохраните этот файл в той же папке. Затем в этой папке откройте открытое командное окно, здесь вы можете сделать это, одновременно нажав клавишу Shift и щелкнув правой кнопкой мыши. Затем в команде введите python setup.py(or the name you have given to new file) build. Он создаст папку сборки, и в этой папке вы найдете файл .exe.

person Aakash Gupta    schedule 21.06.2020
comment
Как это работает с киви? Я использую pyinstaller, потому что это то, что рекомендовало руководство kivy. Нужно ли мне что-то делать по-другому из-за киви? - person Gevezo; 21.06.2020
comment
Нет, я так не думаю. У вас есть какой-то дополнительный файл, например .kv или какие-то другие файлы? - person Aakash Gupta; 22.06.2020