Python - 创建一个运行代码的EXE,而不是编译时的代码

Mat*_*ier 16 python executable pygame launcher dynamic-import

我正在制作一个设计为模块化的pygame程序.我正在使用main.py文件的pygame2exe构建一个exe,它基本上只是导入真正的主游戏并运行它.我希望的是一种将从EXE执行Python脚本的启动程序,而不是包含所有不可变文件的单个程序.

最好的方法是什么?我尝试使用imp在运行时动态导入所有模块而不是隐式导入它们,但这似乎打破了对象继承.

Eug*_*sky 8

经过一些实验,我找到了解决方案.

  1. source在应用程序的主文件夹中创建一个单独的文件夹.这里将放置源文件.同时将文件放入文件__init__.py夹.让我们命名一个主文件main_module.py.

  2. 将其所有内容作为数据文件添加到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")]
              }
         )
    
    Run Code Online (Sandbox Code Playgroud)
  3. Make 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')
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在main_module.py将导入,如果它导入您的模块,它们也将在层次结构中的位置导入.例如,头部main_module.py可以是这样的:

     import user_tweaks
     from user_data import parser
    
    Run Code Online (Sandbox Code Playgroud)

    这些文件user_tweaks.pyuser_data.py应位于source夹在相对适当的路径main_module.py.

您可以在source不重新编译程序本身的情况下更改文件夹的内容.任何时候程序运行它使用的新鲜内容source.

因此,您有一个应用程序文件夹:

  • 一个单独的启动器 - 简单的.exe文件
  • 所有必需的模块
  • 您的应用程序及其所有模块.


Eug*_*sky 1

去年夏天,我一直在努力解决同样的问题——从 python 脚本构建单个 .exe。然而,没有 PyGame,但有 PyQt5,这也增加了一些类似的问题。纯标准工具都没有帮助我。

最后我用链解决了这个问题:make + Py2exe + 7Zip + Resource Hacker。该套件为我提供了包含所有资源的单个 .exe 文件,无需安装 - 因此您可以将其放在 Windows 盒子上的任何位置并运行。

这里有详细的文章:exebuilt with cx_Freeze, PyQt5, Python3 can't import ExtensionLoader_PyQt5_QtWidgets.py and run

如有任何问题,请随时提出。