2012-06-12 10 views
24

Ich genieße wirklich Bottle bis jetzt, aber die Tatsache, dass ich CTRL + C aus dem Server muss und es jedes Mal neu starten, wenn ich einen Code ändern, ist ein großer Schlag auf meine Produktivität. Ich habe darüber nachgedacht, Watchdog zu verwenden, um zu verfolgen, Dateien zu ändern, dann den Server neu starten, aber wie kann ich das tun, wenn die bottle.run Funktion blockiert.Wie kann ich Flasche bei Dateiänderung neu starten?

den Server von einem externen Scripts ausführen, die für Dateiänderungen Uhren scheint wie ein viele der Arbeit bis zu setzen. Ich denke, das war ein universelles Problem für Bottle, CherryPy und etcetera Entwickler.

Vielen Dank für Ihre Lösungen für das Problem!

Antwort

38

Check-out aus dem Tutorial ein Abschnitt mit dem Titel "Auto Reloading"

Während der Entwicklung haben Sie den Server viel starten Sie Ihre letzten Änderungen zu testen. Der automatische Wiederlader kann dies für Sie tun. Jedes Mal, wenn Sie eine Moduldatei bearbeiten, startet der Reloader den Serverprozess neu und lädt die neueste Version Ihres Codes.

Dies gibt das folgende Beispiel:

from bottle import run 
run(reloader=True) 
+0

Oh, cool! Gibt es Situationen, in denen ein Modul nicht erneut geladen werden kann? Ich nehme an, es beobachtet alle importierten Module – Hubro

+0

Leider habe ich nicht genug Erfahrung, um auf die eine oder andere Weise sagen zu können. –

+2

Es überwacht alle importierten Module und startet dann den Serverprozess vollständig neu. Es gibt derzeit keine Möglichkeit, der Überwachungsliste zusätzliche Dateien hinzuzufügen (z. B. Vorlagen), aber Vorlagen werden im Debug-Modus sowieso nicht zwischengespeichert. – defnull

3

Mit

run(reloader=True) 

gibt es Situationen, in denen es nicht wie nicht nachladen, wenn der Import in einem def ist. Um ein Neuladen zu erzwingen benutzte ich

subprocess.call(['touch', 'mainpgm.py']) 

und es lädt in Linux fein.

1

Verwenden Sie reloader=True in run(). Beachten Sie, dass dies in Windows unter if __name__ == "__main__": aufgrund der Funktionsweise des Moduls multiprocessing sein muss.

from bottle import run 

if __name__ == "__main__": 
    run(reloader=True) 
0

Diese Skripte sollten tun, was Sie suchen.

AUTOLOAD.PY

import os 
def cherche(dir): 
    FichList = [ f for f in os.listdir(dir) if os.path.isfile(os.path.join(dir,f)) ] 
    return FichList 

def read_file(file): 
    f = open(file,"r") 
    R=f.read() 
    f.close() 
    return R 

def load_html(dir="pages"): 
    FL = cherche(dir) 
    R={} 
    for f in FL: 
     if f.split('.')[1]=="html": 
      BUFF = read_file(dir+"/"+f) 
      R[f.split('.')[0]] = BUFF 
    return R 

MAIN.PY

# -*- coding: utf-8 -*- 

#Version 1.0 00:37 


import sys 
reload(sys) 
sys.setdefaultencoding("utf-8") 
import datetime 
import ast 
from bottle import route, run, template, get, post, request, response, static_file, redirect 

#AUTOLOAD by LAGVIDILO 
import autoload 
pages = autoload.load_html() 




BUFF = "" 
for key,i in pages.iteritems(): 
    BUFF=BUFF+"@get('/"+key+"')\n" 
    BUFF=BUFF+"def "+key+"():\n" 
    BUFF=BUFF+" return "+pages[key]+"\n" 

print "=====\n",BUFF,"\n=====" 
exec(BUFF) 


run(host='localhost', port=8000, reloader=True) 
Verwandte Themen