本文共 2059 字,大约阅读时间需要 6 分钟。
悔不当初啊,怎么没早看到这个Day13的教程呢。
本篇博客是为了解决每次写完代码后需要在cmd命令行ctrl + C中断程序然后重新启动的问题。 本文的思路是检测www目录下的代码改动,一旦有改动,就自动重启服务器。 因此按照这个思路,我们可以编写一个辅助程序pymonitor.py
,,并时刻监控www目录下的代码改动,当有改动的时候,先把当前app.py进程杀掉,再重启,就完成了服务器进程的自动重启。 要监控目录文件的变化,我们也无需自己手动定时扫描,Python的第三方库watchdog可以利用操作系统的API来监控目录文件的变化,并发送通知。代码:
pip install watchdog
#!/usr/bin/env python3# -*- coding: utf-8 -*-__author__ = 'Michael Liao'import os, sys, time, subprocessfrom watchdog.observers import Observerfrom watchdog.events import FileSystemEventHandlerdef 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 = Nonedef 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 = Nonedef 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)
参考博客
转载地址:http://lmlxi.baihongyu.com/