AB786883603

在编写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的,这里有个Live​Reload插件,在改动php, html,css,js都能重刷chrome,这样修改网页起来,只需在编辑器上保存就可以在浏览器查看最新的页面了,不用到浏览器上按刷新。
这里找了个安装教程

分类:

技术点:

相关文章: