2015-08-21 11 views
6

Ho scritto un'applicazione per flask e funziona perfettamente. Volevo distribuirlo come un eseguibile. Provato a farlo usando pyinstaller flaskScript.py cartella dist generata. Entrato nella cartella dist e fatto doppio clic sul mio eseguibile flaskScript, avvia il mio server. Sulla accesso alla URL, localhost: 9090 dà la seguente eccezioneApplicazione di flask creata utilizzando pyinstaller che non rende index.html

jinja2.exceptions.TemplateNotFound 

TemplateNotFound: index.html 

Traceback (most recent call last) 
File "/Users/george/Downloads/flaskApps/flaskScript/build/flaskScript/out00-PYZ.pyz/flask.app", line 1836, in __call__ 

File "/Users/george/Downloads/flaskApps/flaskScript/build/flaskScript/out00-PYZ.pyz/flask.app", line 1820, in wsgi_app 

File "/Users/george/Downloads/flaskApps/flaskScript/build/flaskScript/out00-PYZ.pyz/flask.app", line 1403, in handle_exception 

File "/Users/george/Downloads/flaskApps/flaskScript/build/flaskScript/out00-PYZ.pyz/flask.app", line 1817, in wsgi_app 

File "/Users/george/Downloads/flaskApps/flaskScript/build/flaskScript/out00-PYZ.pyz/flask.app", line 1477, in full_dispatch_request 

File "/Users/george/Downloads/flaskApps/flaskScript/build/flaskScript/out00-PYZ.pyz/flask.app", line 1381, in handle_user_exception 

File "/Users/george/Downloads/flaskApps/flaskScript/build/flaskScript/out00-PYZ.pyz/flask.app", line 1475, in full_dispatch_request 

File "/Users/george/Downloads/flaskApps/flaskScript/build/flaskScript/out00-PYZ.pyz/flask.app", line 1461, in dispatch_request 

File "<string>", line 13, in index 

File "/Users/george/Downloads/flaskApps/flaskScript/build/flaskScript/out00-PYZ.pyz/flask.templating", line 127, in render_template 

File "/Users/george/Downloads/flaskApps/flaskScript/build/flaskScript/out00-PYZ.pyz/jinja2.environment", line 851, in get_or_select_template 

File "/Users/george/Downloads/flaskApps/flaskScript/build/flaskScript/out00-PYZ.pyz/jinja2.environment", line 812, in get_template 

File "/Users/george/Downloads/flaskApps/flaskScript/build/flaskScript/out00-PYZ.pyz/jinja2.environment", line 774, in _load_template 

File "/Users/george/Downloads/flaskApps/flaskScript/build/flaskScript/out00-PYZ.pyz/flask.templating", line 64, in get_source 

TemplateNotFound: index.html 

Anche se funziona bene nel setup dev durante l'esecuzione di python flaskScript.py

+0

Amico, ti sei perso 'sys.path.append (o s.getcwd()) '. – dsgdfg

+0

Hi Ho aggiunto: import sys sys.path.append (os.getcwd()) nel file di pitone e dà lo stesso errore, devo aggiungere alla linea di modello il render @ app.route ('/ index') def index(): return render_template ('index.html') Da qualche parte nella dichiarazione di reso? Grazie in anticipo! – George

+0

Domande duplicate qui: http: // StackOverflow.it/questions/2180247/does-the-jinja2-templating-language-have-the-concept-of-here-current-director – dsgdfg

risposta

6

Questa domanda è un po 'vecchio ora, ma ero avendo lo stesso problema (Python 3.4.3, Flask 0.10.1 e PyInstaller 3.1.1) quando lo si configura in un singolo file.

sono riuscito a risolverlo aggiungendo quanto segue allo script di inizializzazione (app\__init__.py):

import sys 
import os 
from flask import Flask 
# Other imports 

if getattr(sys, 'frozen', False): 
    template_folder = os.path.join(sys._MEIPASS, 'templates') 
    app = Flask(__name__, template_folder=template_folder) 
else: 
    app = Flask(__name__) 

# etc 

Il problema è che quando il sito è in esecuzione in forma di pacchetto, i modelli sono all'interno di una directory chiamata _MEIxxxxxx nella directory temp (vedere this nel manuale PyInstaller), quindi dobbiamo comunicarlo a Flask.

Ciò viene eseguito con l'argomento template_folder (che ho trovato in questa risposta here e successivamente nello API docs).

Infine, lo if è lì per garantire che possiamo ancora utilizzarlo non imballato durante lo sviluppo. Se è frozen, allora lo script è impacchettato e dobbiamo dire a Flask dove trovare i modelli; altrimenti lo stiamo eseguendo in un ambiente Python (preso da here) e le impostazioni predefinite funzioneranno (supponendo che tu stia utilizzando la directory standard templates).

+0

Questa è la risposta corretta! – ubugnu

2
if getattr(sys, 'frozen', False):                                  
     template_folder = os.path.join(sys.executable, '..','templates')                         
     static_folder = os.path.join(sys.executable, '..','static')                          
     app = Flask(__name__, template_folder = template_folder,\                           
           static_folder = static_folder) 

copiare questo codice e incollarlo nel file. ora pyinstaller cerca la cartella statica e di modello nella tua directory dist. Ora copia e incolla la cartella statica e di modello nella cartella dist. lo farà funziona

0

Ho appena scritto un post su questo problema e altri simili, Create one executable file for a Flask app with PyInstaller

Fondamentalmente una soluzione elegante è quello di eseguire il seguente:

di Windows

pyinstaller -w -F --add-data "templates;templates" --add-data "static;static" app.py 

Linux (NON TESTATO)

pyinstaller -w -F --add-data "templates:templates" --add-data "static:static" app.py 
Problemi correlati