Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

637
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!