Python: crea un EXE que ejecuta el código como está escrito, no como estaba cuando se compiló
pygame executable (2)
Después de algunos experimentos he encontrado una solución.
Cree una
source
carpeta separada en la carpeta principal de la aplicación. Aquí se colocarán los archivos fuente. También coloque el archivo__init__.py
en la carpeta. Permite nombrar un archivo principal comomain_module.py
.Agregue todo su contenido como archivos de datos a la configuración de py2exe
setup.py
. Ahora, después de compilar el programa, estos archivos se colocarán en la carpeta 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
: su tarea es importar todo el sistema y las bibliotecas requeridas como pygame, pyqt, etc. Luego ejecuta tu programa:import sys, time, os, hashlib, atexit # std modules import PyQt5, ... # foreign libraries sys.path.insert(0, ''source'') exec(''import main_module'')
Ahora
main_module.py
se importará, si importa sus módulos, también se importarán en sus lugares en la jerarquía. Por ejemplo, el jefe demain_module.py
puede ser así:import user_tweaks from user_data import parser
Estos archivos
user_tweaks.py
yuser_data.py
deben ubicarse en la carpeta desource
en las rutas apropiadas en relación conmain_module.py
.
Puede cambiar el contenido de la carpeta de source
sin el programa de recompilación en sí. Cada vez que el programa se ejecuta, utiliza nuevos contenidos de la source
.
Como resultado tienes una carpeta de aplicación con:
- Un lanzador separado - archivo .exe simple
- Todos los módulos requeridos
- Su aplicación con todos sus módulos.
Estoy haciendo un programa de pygame que está diseñado para ser modular. Estoy creando un archivo ejecutable con pygame2exe del archivo main.py, que básicamente solo importa el juego principal real y lo ejecuta. Lo que espero es una especie de lanzador que ejecute los scripts de Python desde un EXE, en lugar de un solo programa que contenga todos los archivos inmutables.
¿Cuál es la mejor manera de hacer esto? He intentado usar imp para importar dinámicamente todos los módulos en tiempo de ejecución en lugar de importarlos implícitamente, pero eso parece romper la herencia de objetos.
El verano pasado he estado luchando con el mismo problema: compilar .exe desde el script de python. Sin embargo, no había PyGame, pero sí un PyQt5, que añadía algunos problemas por igual. Ninguna de las herramientas estándar puras me ayudó.
Finalmente resolví el problema con un chaine: make + Py2exe + 7Zip + Resource Hacker. Este conjunto me dio un solo archivo .exe con todos los recursos a bordo, que no requieren instalación, por lo que puede ponerlo en cualquier lugar en Windows Box y ejecutar.
Aquí se detalla el artículo: exe creado con cx_Freeze, PyQt5, Python3 no puede importar ExtensionLoader_PyQt5_QtWidgets.py y ejecutar
Por favor, siéntase libre de hacer cualquier pregunta.