我正在制作一个设计为模块化的 pygame 程序。我正在使用文件 main.py 的 pygame2exe 构建一个 exe,它基本上只是导入真正的主游戏并运行它。我希望的是一种从 EXE 执行 Python 脚本的启动器,而不是包含所有不可变文件的单个程序。
解决此问题的最佳方法是什么?我尝试使用 imp 在运行时动态导入所有模块,而不是隐式导入它们,但这似乎破坏了对象继承。
我正在制作一个设计为模块化的 pygame 程序。我正在使用文件 main.py 的 pygame2exe 构建一个 exe,它基本上只是导入真正的主游戏并运行它。我希望的是一种从 EXE 执行 Python 脚本的启动器,而不是包含所有不可变文件的单个程序。
解决此问题的最佳方法是什么?我尝试使用 imp 在运行时动态导入所有模块,而不是隐式导入它们,但这似乎破坏了对象继承。
经过一些实验,我找到了解决方案。
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")]
}
)
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')
现在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
.
结果,您有一个应用程序文件夹,其中包含:
去年夏天,我一直在努力解决同样的问题——从 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
请随时提出任何问题。