Mat*_*ier 16 python executable pygame launcher dynamic-import
我正在制作一个设计为模块化的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")]
}
)
Run Code Online (Sandbox Code Playgroud)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)现在main_module.py将导入,如果它导入您的模块,它们也将在层次结构中的位置导入.例如,头部main_module.py可以是这样的:
import user_tweaks
from user_data import parser
Run Code Online (Sandbox Code Playgroud)
这些文件user_tweaks.py和user_data.py应位于source夹在相对适当的路径main_module.py.
您可以在source不重新编译程序本身的情况下更改文件夹的内容.任何时候程序运行它使用的新鲜内容source.
因此,您有一个应用程序文件夹:
去年夏天,我一直在努力解决同样的问题——从 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
如有任何问题,请随时提出。