如果磁盘上的文件发生更改,我如何重新加载 python 类?

如何解决如果磁盘上的文件发生更改,我如何重新加载 python 类?

为了支持存储在源类文件中的参数的运行时更改并用作带有字段的对象,我如何检查自运行时启动或自上次重新加载以来对象的源文件是否被修改,并重新加载类并创建对象的新实例?

解决方法

这个方法似乎有效:

def reload_class_if_modified(obj:object,every:int=1)->object:
    """
    Reloads an object if the source file was modified since runtime started or since last reloaded

    :param obj: the original object
    :param every: only check every this many times we are invoked

    :returns: the original object if classpath file has not been modified 
              since startup or last reload time,otherwise the reloaded object
    """
    reload_class_if_modified.counter+=1
    if reload_class_if_modified.counter>1 and reload_class_if_modified.counter%every!=0:
        return obj
    try:
        module=inspect.getmodule(obj)
        cp=Path(module.__file__)
        mtime=cp.stat().st_mtime
        classname=type(obj).__name__

        if (mtime>reload_class_if_modified.start_time and (not (classname in reload_class_if_modified.dict))) \
                or ((classname in reload_class_if_modified.dict) and mtime>reload_class_if_modified.dict[classname]):
            importlib.reload(module)
            class_ =getattr(module,classname)
            o=class_()
            reload_class_if_modified.dict[classname]=mtime
            return o
        else:
            return obj
    except Exception as e:
        logger.error(f'could not reload {obj}: got exception {e}')
        return obj

reload_class_if_modified.dict=dict()
reload_class_if_modified.start_time=time()
reload_class_if_modified.counter=0

像这样使用它:

import neural_mpc_settings
from time import sleep as sleep
g=neural_mpc_settings()
while True:
    g=reload_class_if_modified(g,every=10)
    print(g.MIN_SPEED_MPS,end='\r')
    sleep(.1)

neural_mpc_settings 在哪里

class neural_mpc_settings():
    MIN_SPEED_MPS = 5.0

当我更改磁盘上的 neural_mpc_settings.py 时, 类被重新加载,新对象 返回反映了新的类字段。

,

您可能需要考虑使用像 watchdog 这样的库,它可以让您在文件更改时触发处理程序。您可以将参数与代码搭配使用,而不是将它们存储在数据文件中,使用数据加载器方法在启动时和基础数据文件发生更改时调用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?