17

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

解决此问题的最佳方法是什么?我尝试使用 imp 在运行时动态导入所有模块,而不是隐式导入它们,但这似乎破坏了对象继承。

4

2 回答 2

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")]
              }
         )
    
  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')
    
  4. 现在main_module.py将被导入,如果它导入您的模块,它们也将被导入到它们在层次结构中的位置。例如头部main_module.py可以是这样的:

     import user_tweaks
     from user_data import parser
    

    这些文件应该位于user_tweaks.py相对于.user_data.pysourcemain_module.py

您可以更改source文件夹的内容而无需重新编译程序本身。任何时候程序运行它都会使用source.

结果,您有一个应用程序文件夹,其中包含:

  • 一个单独的启动器 - 简单的 .exe 文件
  • 所有必需的模块
  • 您的应用程序及其所有模块。
于 2016-03-20T10:40:41.420 回答
1

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

最后我用chaine解决了这个问题:make + Py2exe + 7Zip + Resource Hacker。这套系统给了我一个单一的 .exe,里面包含了所有的资源,不需要安装 - 所以你可以把它放在 windows 盒子上的任何地方并运行。

这里有详细文章:用cx_Freeze、PyQt5、Python3构建的exe can't import ExtensionLoader_PyQt5_QtWidgets.py and run

请随时提出任何问题。

于 2016-03-19T18:03:47.607 回答