Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

631
Vistas
Aplicación Flask empaquetada con PyInstaller sin plantillas ni estática incluida en EXE

Estoy tratando de empaquetar mi aplicación run.py en run.exe , pero no incluyo las templates html y los archivos de carpetas static en el archivo .exe, para que puedan modificarse y actualizarse fácilmente sin necesidad de volver a compilar el archivo .exe.

La estructura de la aplicación es:

 run.py /serversystem /templates /static /main /users

En las carpetas "principal" y "usuarios" hay archivos __init__.py vacíos y archivos routes.py con el código real, en una arquitectura Blueprint.

Estoy usando pyinstaller --onefile run.py y copio el archivo dist\run.exe empaquetado en la carpeta raíz donde vive run.py

El error que recibo es que Jinja no puede encontrar la plantilla cuando le digo que la renderice. Esto es de http://localhost:3000/about :

 Traceback (most recent call last): File "C:\Users\GP\AppData\Local\Temp\_MEI171402\flask\app.py", line 2091, in __call__ File "C:\Users\GP\AppData\Local\Temp\_MEI171402\flask\app.py", line 2076, in wsgi_app File "C:\Users\GP\AppData\Local\Temp\_MEI171402\flask\app.py", line 2073, in wsgi_app File "C:\Users\GP\AppData\Local\Temp\_MEI171402\flask\app.py", line 1518, in full_dispatch_request File "C:\Users\GP\AppData\Local\Temp\_MEI171402\flask\app.py", line 1516, in full_dispatch_request File "C:\Users\GP\AppData\Local\Temp\_MEI171402\flask\app.py", line 1502, in dispatch_request File "C:\Users\GP\AppData\Local\Temp\_MEI171402\serversystem\main\routes.py", line 17, in about File "C:\Users\GP\AppData\Local\Temp\_MEI171402\flask\templating.py", line 148, in render_template File "C:\Users\GP\AppData\Local\Temp\_MEI171402\jinja2\environment.py", line 1068, in get_or_select_template File "C:\Users\GP\AppData\Local\Temp\_MEI171402\jinja2\environment.py", line 997, in get_template File "C:\Users\GP\AppData\Local\Temp\_MEI171402\jinja2\environment.py", line 958, in _load_template File "C:\Users\GP\AppData\Local\Temp\_MEI171402\jinja2\loaders.py", line 125, in load File "C:\Users\GP\AppData\Local\Temp\_MEI171402\flask\templating.py", line 59, in get_source File "C:\Users\GP\AppData\Local\Temp\_MEI171402\flask\templating.py", line 95, in _get_source_fast jinja2.exceptions.TemplateNotFound: about.html

El mismo código funciona bien en el IDE.

He agregado un trozo de código a /systemserver/__init__.py que dice:

 def create_app(config_class=Config): if getattr(sys, 'frozen', False): print("Starting in FROZEN Mode") else: print("Starting in NORMAL Mode") app = Flask(__name__) print("Instance Path = {}".format(app.instance_path)) print("Root Path = {}".format(app.root_path)) print("Templates Path = {}".format(app.template_folder)) print("Static Path = {}".format(app.static_folder)) print("Static URL Path = {}".format(app._static_url_path))

Cuando ejecuto desde IDE (VSCode), obtengo esto:

 Starting in NORMAL Mode Instance Path = h:\MyProject\Alfa1D\instance Root Path = h:\MyProject\Alfa1D\serversystem Templates Path = templates Static Path = h:\MyProject\Alfa1D\serversystem\static Static URL Path = None

Cuando se ejecuta desde un archivo exe, este es el resultado:

 Starting in FROZEN Mode Instance Path = C:\Users\GP\AppData\Local\Temp\_MEI144962\var\serversystem-instance Root Path = C:\Users\GP\AppData\Local\Temp\_MEI144962\serversystem Templates Path = templates Static Path = C:\Users\GP\AppData\Local\Temp\_MEI144962\serversystem\static Static URL Path = None

Como no he usado las opciones template_folder=template_folder, static_folder=static_folder al crear la aplicación Flask, la plantilla y los archivos estáticos no se empaquetan, por lo que no van a la carpeta temporal MEI.

¿Es posible empaquetar el archivo EXE y, al ejecutarlo desde donde está run.py, hacer que use la plantilla y los archivos estáticos de las carpetas fijas y no la temporal?

Uso Python 3.10 y PyInstaller 4.7, en Windows 10.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Ok, el siguiente enfoque funcionó bien con el interruptor --onefile PyInstaller:

 templatesDir = os.getcwd() + '/serversystem/templates' staticDir = os.getcwd() + '/serversystem/static' app = Flask(__name__, template_folder=templatesDir, static_folder=staticDir)

Como estoy ejecutando mi script principal desde una carpeta que tiene una carpeta "serversystem", donde se encuentran a su vez "templates" y "static", esa es mi forma de obtenerlo. Si tiene plantillas y estáticas en carpetas directas, debe usar os.getcwd() + '/templates' y lo mismo para '/static' .

Esto funcionó muy bien en los modos normal (intérprete de Python) y congelado (paquete de Pyinstaller).

Esta referencia ayudó mucho, especialmente el pequeño script de muestra al final:

https://pyinstaller.readthedocs.io/en/stable/runtime-information.html

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda