如何在 Python 中动态重新加载函数?
How to dynamically reload function in Python?
我正在尝试创建一个动态监视 jupyter notebooks 的进程,在修改时编译它们并将它们导入到我当前的文件中,但是我似乎无法执行更新的代码。它只执行加载的第一个版本。
有一个名为 producer.py
的文件重复调用此函数:
import fs.fs_util as fs_util
while(True):
fs_util.update_feature_list()
在 fs_util.py
中,我执行以下操作:
from fs.feature import Feature
import inspect
from importlib import reload
import os
def is_subclass_of_feature(o):
return inspect.isclass(o) and issubclass(o, Feature) and o is not Feature
def get_instances_of_features(name):
module = __import__(COMPILED_MODULE, fromlist=[name])
module = reload(module)
feature_members = getattr(module, name)
all_features = inspect.getmembers(feature_members, predicate=is_subclass_of_feature)
return [f[1]() for f in all_features]
此函数调用者:
def update_feature_list(name):
os.system("jupyter nbconvert --to script {}{} --output {}{}"
.format(PATH + "/" + s3.OUTPUT_PATH, name + JUPYTER_EXTENSION, PATH + "/" + COMPILED_PATH, name))
features = get_instances_of_features(name)
for f in features:
try:
feature = f.create_feature()
except Exception as e:
print(e)
还有其他不相关的代码检查文件是否已被修改等
我可以看出文件正在正确重新加载,因为当我在 class 上使用 inspect.getsource(f.create_feature)
时,它显示更新的源代码,但是在执行期间它 return 是旧值。我已经通过更改打印语句以及比较 return 值来验证这一点。
此外,对于我要导入的文件的更多上下文:
from fs.feature import Feature
class SubFeature(Feature):
def __init__(self):
Feature.__init__(self)
def create_feature(self):
return "hello"
我想知道我做错了什么?
所以我发现我做错了什么。
当调用 reload
时,我正在重新加载我新导入的模块,我认为这是相当愚蠢的。正确的解决方案(在我的例子中)是从 sys.modules
重新加载模块,所以它会像 reload(sys.modules[COMPILED_MODULE + "." + name])
我正在尝试创建一个动态监视 jupyter notebooks 的进程,在修改时编译它们并将它们导入到我当前的文件中,但是我似乎无法执行更新的代码。它只执行加载的第一个版本。
有一个名为 producer.py
的文件重复调用此函数:
import fs.fs_util as fs_util
while(True):
fs_util.update_feature_list()
在 fs_util.py
中,我执行以下操作:
from fs.feature import Feature
import inspect
from importlib import reload
import os
def is_subclass_of_feature(o):
return inspect.isclass(o) and issubclass(o, Feature) and o is not Feature
def get_instances_of_features(name):
module = __import__(COMPILED_MODULE, fromlist=[name])
module = reload(module)
feature_members = getattr(module, name)
all_features = inspect.getmembers(feature_members, predicate=is_subclass_of_feature)
return [f[1]() for f in all_features]
此函数调用者:
def update_feature_list(name):
os.system("jupyter nbconvert --to script {}{} --output {}{}"
.format(PATH + "/" + s3.OUTPUT_PATH, name + JUPYTER_EXTENSION, PATH + "/" + COMPILED_PATH, name))
features = get_instances_of_features(name)
for f in features:
try:
feature = f.create_feature()
except Exception as e:
print(e)
还有其他不相关的代码检查文件是否已被修改等
我可以看出文件正在正确重新加载,因为当我在 class 上使用 inspect.getsource(f.create_feature)
时,它显示更新的源代码,但是在执行期间它 return 是旧值。我已经通过更改打印语句以及比较 return 值来验证这一点。
此外,对于我要导入的文件的更多上下文:
from fs.feature import Feature
class SubFeature(Feature):
def __init__(self):
Feature.__init__(self)
def create_feature(self):
return "hello"
我想知道我做错了什么?
所以我发现我做错了什么。
当调用 reload
时,我正在重新加载我新导入的模块,我认为这是相当愚蠢的。正确的解决方案(在我的例子中)是从 sys.modules
重新加载模块,所以它会像 reload(sys.modules[COMPILED_MODULE + "." + name])