python pygame executable launcher dynamic-import

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.

  1. 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 como main_module.py .

  2. 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")] } )

  3. 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'')

  4. 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 de main_module.py puede ser así:

    import user_tweaks from user_data import parser

    Estos archivos user_tweaks.py y user_data.py deben ubicarse en la carpeta de source en las rutas apropiadas en relación con main_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.