如何在文件更改时让Bottle重新启动?

时间:2012-06-12 20:18:41

标签: python cherrypy bottle

到目前为止我真的很享受Bottle,但事实上我必须将CTRL + C从服务器中移出并在每次更改代码时重新启动它,这对我的工作效率影响很大。我已经考虑使用Watchdog来跟踪文件更改然后重新启动服务器,但是当bottle.run函数阻塞时我该怎么做呢。

从监视文件更改的外部脚本运行服务器似乎需要设置的很多工作。我认为这是Bottle,CherryPy和其他开发人员的普遍问题。

感谢您解决此问题!

4 个答案:

答案 0 :(得分:46)

从教程中查看标题为"Auto Reloading"

的部分
  

在开发过程中,您必须重新启动服务器以测试您的服务器   近期变动。自动重新加载器可以为您完成此操作。每次你   编辑模块文件,重新加载器重新启动服务器进程并加载   最新版本的代码。

这给出了以下示例:

from bottle import run
run(reloader=True)

答案 1 :(得分:3)

run(reloader=True)

有些情况下,当导入在def中时,它不会重新加载。为了强制重新加载,我使用了

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

它在linux中重新加载。

答案 2 :(得分:1)

reloader=True中使用run()。请注意,在Windows中,由于if __name__ == "__main__":模块的工作方式,因此必须位于multiprocessing下。

from bottle import run

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

答案 3 :(得分:0)

这些脚本应该可以满足您的需求。

<强> 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)