I'm making a pygame program that is designed to be modular. I am building an exe with pygame2exe of the file main.py, which basically just imports the real main game and runs it. What I'm hoping for is a sort of launcher that will execute Python scripts from an EXE, rather than a single program containing all immutable files.
What is the best way to go about this? I've tried using imp to dynamically import all modules at runtime instead of implicitly importing them, but that seems to break object inheritance.
After some experiments I've found a solution.
Create a separate folder
source
in the main folder of the application. Here will be placed source files. Also place file__init__.py
to the folder. Lets name a main file likemain_module.py
.Add all of its contents as a data files to the py2exe configuration
setup.py
. Now after compiling the program, these files will be placed in the dist folder.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
- it's task is to import all system and required libraries like pygame, pyqt and so on. Then run you program:import sys, time, os, hashlib, atexit # std modules import PyQt5, ... # foreign libraries sys.path.insert(0, 'source') exec('import main_module')
Now
main_module.py
will be imported, if it imports your modules, they will be imported too in their places in hierarchy. For example head of themain_module.py
can be like this:import user_tweaks from user_data import parser
These files
user_tweaks.py
anduser_data.py
should be located insource
folder at appropriate paths relative tomain_module.py
.
You may change contents of source
folder without recompilation program itself. Any time program runs it uses fresh contents of source
.
As a result you have an application folder with:
- A separate launcher - simple .exe file
- All required modules
- Your application with all its modules.
Last summer I have been struggling with the same problem - build single .exe from python script. However there was no PyGame, but there was a PyQt5, which added some problems alike. None of the pure standard tools helped me.
Finally I'd solved the problem with a chaine: make + Py2exe + 7Zip + Resource Hacker. This set gave me single .exe with all the resources onboard, which don't require installaton - so you can put it everywhere on windows box and run.
Here's detailed article: exe built with cx_Freeze, PyQt5, Python3 can't import ExtensionLoader_PyQt5_QtWidgets.py and run
Please, feel free to ask any questions.
来源:https://stackoverflow.com/questions/35906523/python-create-an-exe-that-runs-code-as-written-not-as-it-was-when-compiled