当前位置: 代码迷 >> 综合 >> Python廖雪峰实战web开发(Day13-提高开发效率)
  详细解决方案

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

热度:3   发布时间:2023-12-27 12:00:21.0

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