Подтвердить что ты не робот

Python - создать EXE, который запускает код как написанный, а не так, как это было при компиляции

Я делаю программу pygame, которая предназначена для модульной работы. Я создаю exe с pygame2exe файла main.py, который в основном просто импортирует настоящую главную игру и запускает ее. То, что я надеюсь, это своего рода пусковая установка, которая будет выполнять скрипты Python из EXE, а не одну программу, содержащую все неизменяемые файлы.

Каков наилучший способ сделать это? Я попытался использовать imp для динамического импорта всех модулей во время выполнения вместо имплицитного импортера, но это, похоже, нарушает наследование объектов.

4b9b3361

Ответ 1

После некоторых экспериментов я нашел решение.

  • Создайте отдельную папку source в основной папке приложения. Здесь будут размещены исходные файлы. Также поместите файл __init__.py в папку. Позволяет назвать основной файл, например main_module.py.

  • Добавьте все его содержимое в виде файлов данных в конфигурацию py2exe setup.py. Теперь после компиляции программы эти файлы будут помещены в папку dist.

    data_files += [('source', glob('source/*.py'),)]
    setup(
          data_files=data_files,
          ....  # other options
         windows=[
              {
                "script": "launcher.py",
                "icon_resources": [(0, "resources/favicon.ico")]
              }
         )
    
  • Сделать launcher.py - задача состоит в том, чтобы импортировать все системные и требуемые библиотеки, такие как pygame, pyqt и т.д. Затем запустите программу:

    import sys, time, os, hashlib, atexit  # std modules
    import PyQt5, ...   # foreign libraries
    sys.path.insert(0, 'source')
    exec('import main_module')
    
  • Теперь main_module.py будет импортирован, если он импортирует ваши модули, они также будут импортированы в своих местах в иерархии. Например, глава main_module.py может быть таким:

     import user_tweaks
     from user_data import parser
    

    Эти файлы user_tweaks.py и user_data.py должны находиться в папке source на соответствующих путях относительно main_module.py.

Вы можете изменить содержимое папки source без самой программы перекомпиляции. В любой программе времени она использует новое содержимое source.

В результате у вас есть папка приложения с:

  • Отдельная пусковая установка - простой .exe файл
  • Все необходимые модули
  • Ваше приложение со всеми его модулями.

Ответ 2

Прошлым летом я боролся с той же проблемой - создайте single.exe из python script. Однако PyGame не было, но был PyQt5, который также добавил некоторые проблемы. Ни один из стандартных инструментов не помог мне.

Наконец, я решил проблему с цепочкой: make + Py2exe + 7Zip + Resource Hacker. Этот набор дал мне один файл .exe со всеми ресурсами на борту, которые не требуют установки - так что вы можете поместить его всюду на окно и запустить.

Здесь подробная статья: exe, построенная с помощью cx_Freeze, PyQt5, Python3 не может импортировать ExtensionLoader_PyQt5_QtWidgets.py и запускать

Пожалуйста, не стесняйтесь задавать любые вопросы.