Python廖雪峰实战web开发(Day13-提高开发效率)

在编写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,这样修改网页起来,只需在编辑器上保存就可以在浏览器查看最新的页面了,不用到浏览器上按刷新。
这里找了个安装教程

转载于:https://www.cnblogs.com/AB786883603/p/8325435.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值