网站搭建笔记精简版---廖雪峰WebApp实战-Day13:提升开发效率笔记
悔不当初啊,怎么没早看到这个Day13的教程呢。
本篇博客是为了解决每次写完代码后需要在cmd命令行ctrl + C中断程序然后重新启动的问题。
本文的思路是检测www目录下的代码改动,一旦有改动,就自动重启服务器。
因此按照这个思路,我们可以编写一个辅助程序pymonitor.py
,让它启动app.py,并时刻监控www目录下的代码改动,当有改动的时候,先把当前app.py进程杀掉,再重启,就完成了服务器进程的自动重启。
安装watchdog库
要监控目录文件的变化,我们也无需自己手动定时扫描,Python的第三方库watchdog可以利用操作系统的API来监控目录文件的变化,并发送通知。代码:
pip install watchdog
编写看门狗程序
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = 'Michael Liao'
import os, sys, time, subprocess
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
def log(s):
print('[Monitor] %s' % s)
class MyFileSystemEventHander(FileSystemEventHandler):
def __init__(self, fn):
super(MyFileSystemEventHander, self).__init__()
self.restart = fn
def on_any_event(self, event):
if event.src_path.endswith('.py'):
log('Python source file changed: %s' % event.src_path)
self.restart()
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()
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:]
if not argv:
print('Usage: ./pymonitor your-script.py')
exit(0)
if argv[0] != 'python': #注意这里将python3改为python
argv.insert(0, 'python') #这里也是,否则会报错
command = argv
path = os.path.abspath('.')
start_watch(path, None)
测试展示
参考博客
廖雪峰的官方网站