Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

636
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda