在编写handler
时,每次修改Python代码,都必须在命令行先Ctrl-C停止服务器,再重启,改动才能生效。
有没有办法让服务器检测到代码修改后自动重新加载呢?
思路是检测www
目录下的代码改动,一旦有改动,就自动重启服务器。
按照这个思路,我们可以编写一个辅助程序pymonitor.py
,让它启动webapp.py
,并时刻监控www目录下的代码改动,有改动时,先把当前webapp.py
进程杀掉,再重启,就完成了服务器进程的自动重启。
这里使用得是Python第三方库watchdog
C:\Uers\Administrator>pip3 install watchdog
利用watchdog
接收文件变化的通知,如果是.py
文件,就自动重启webapp.py
进程。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-''' 创建监视修改重启程序 '''__author__ = 'Seiei'import os, time, sys, subprocess
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandlerdef log(s):print('[Monitor] %s' % s)command = ['echo', 'ok'] #重启操作文件的信息
process = None#退出程序
def kill_process():global processif process:log('Kill process [%s]...' % process.pid)process.kill()process.wait()log('Process ended with code %s.' % process.returncode)process = None#开始程序
def start_process():global process, commandlog('Start process %s...' % ' '.join(command))process = subprocess.Popen(command, stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr)#重启程序
def restart_process():kill_process()start_process()#编辑MyFileSystemEventHander
class MyFileSystemEventHander(FileSystemEventHandler):def __init__(self, fn):super(MyFileSystemEventHander, self).__init__()self.restart = fn #导入重启函数restart_process,没括号def on_any_event(self, event):if event.src_path.endswith('.py'): #监视`.py`后缀文件发生改变log('Python source file changed: %s' % event.src_path)self.restart()#监视
def start_watch(path, callback):observer = Observer()observer.schedule(MyFileSystemEventHander(restart_process), path, recursive=True)observer.start()log('Watching directory %s...' % path)start_process()try:while True:time.sleep(0.5)except KeyboardInterrupt:observer.stop()observer.join()if __name__ == '__main__':argv = sys.argv[1:] #用于在命令行取程序外部输入参数-->http://www.cnblogs.com/aland-1415/p/6613449.htmlif not argv:print('Usage: ./pymonitor your-script.py')exit(0)if argv[0] != 'python':argv.insert(0, 'python')command = argv #操作文件的名字及程序名path = os.path.abspath('.')#根据这监视路径,那文件就得放在监视文件的相同路径上start_watch(path, None)
然后把其命名为pymonitor.py
存放到相应的路径上,在命令行执行:
E:\web_app>pymonitor.py webapp.py
再修改一下相应的handler
,看网页是否重启了~
另外使用sublime和chrome的,这里有个Live?Reload插件,在改动php, html,css,js都能重刷chrome,这样修改网页起来,只需在编辑器上保存就可以在浏览器查看最新的页面了,不用到浏览器上按刷新。
这里找了个安装教程。