如何监控Python文件的更改?
如何监视Python文件的更改?
在某些情况下,你可能不确定如何在你的环境中实现“重新加载应用程序”的操作;使用内置的`reload`函数重新加载更改的模块可能行不通。但是,至于检测是否发生了更改,可以采用以下方法之一。
大多数Python模块都有一个`__file__`属性。
所有加载的模块都存储在`sys.modules`中。
我们可以按照一定的时间间隔遍历`sys.modules`,依次检查每个模块在磁盘上的更改情况。
有时`__file__`指向的是一个`.pyc`文件,而不是`.py`文件,所以你可能需要去掉最后的`c`。有时候一个`.pyc`文件存在,但是`.py`文件不存在;在一个健壮的系统中,你需要考虑到这一点。
下面是一个概念验证代码(不健壮):
_module_timestamps = {} _checking = False def run_checker(): global _checking _checking = True while _checking: for name, module in sys.modules.iteritems(): if hasattr(module, '__file__'): filename = module.__file__ if filename.endswith('.pyc'): filename = filename[:-1] mtime = os.stat(filename).st_mtime if name not in _module_timestamps: _module_timestamps[name] = mtime else: if mtime > _module_timestamps[name]: do_reload(name) else: 'module %r has no file attribute' % (name,) time.sleep(1) def do_reload(modname): print 'I would reload now, because of %r' % (modname,) check_thread = threading.Thread(target=run_checker) check_thread.daemon = True check_thread.start() try: while 1: time.sleep(0.1) except KeyboardInterrupt: print '\nexiting...'
以上就是如何监视Python文件的更改的一个解决方法。通过遍历`sys.modules`中的模块,并检查每个模块在磁盘上的更改情况,可以实现对Python文件更改的监视。
问题的出现原因:用户想要监视Python文件的更改,以便在文件更改时重新启动现有的进程。
解决方法:使用Watchdog库来监视文件变化并重新启动进程。
以下是一个使用Watchdog来监视文件更改并重新启动进程的示例(来自上述内容中的问题链接):
import time from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler import subprocess class MyHandler(FileSystemEventHandler): def on_modified(self, event): # 当文件被修改时执行的操作 print("File modified, restarting process...") # 重新启动进程 subprocess.Popen(["python", "your_script.py"]) if __name__ == "__main__": event_handler = MyHandler() observer = Observer() # 监视文件夹中的文件更改事件 observer.schedule(event_handler, path='your_folder_path', recursive=True) observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join()
这段代码创建了一个名为`MyHandler`的自定义事件处理程序类,当文件被修改时,它将重新启动进程。然后,创建一个观察者对象并将自定义事件处理程序与要监视的文件夹路径关联起来。最后,启动观察者并让它一直运行,直到手动停止或终止。
通过使用Watchdog库,用户可以轻松地监视Python文件的更改并执行相应的操作,例如重新启动进程。