在编写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 FileSystemEventHandler
def log(s):
print('[Monitor] %s' % s)
command = ['echo', 'ok'] #重启操作文件的信息
process = None
#退出程序
def kill_process():
global process
if 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, command
log('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.html
if 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的,这里有个LiveReload插件,在改动php, html,css,js都能重刷chrome,这样修改网页起来,只需在编辑器上保存就可以在浏览器查看最新的页面了,不用到浏览器上按刷新。
这里找了个安装教程。