如何监控Python文件的更改?

18 浏览
0 Comments

如何监控Python文件的更改?

如果代码发生了变化,我想要重启我的Python网络应用程序。但是由于导入模块中的文件可能会发生变化,可能会有大量的文件发生变化...\n如何从导入的包/模块中获取实际的文件名?\n如何高效地检测到修改过的Python文件?是否有相应的库可以实现这个功能?

0
0 Comments

如何监视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文件更改的监视。

0
0 Comments

如何监视Python文件的更改?

问题原因:用户需要知道如何监视Python文件的更改。

解决方法:可以使用gamin来监视Python文件的更改。gamin是另一种选项,它比较适用于Linux系统。

0
0 Comments

问题的出现原因:用户想要监视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文件的更改并执行相应的操作,例如重新启动进程。

0