我正在尝试创建一个过程,以动态监视jupyter笔记本,在修改时对其进行编译,然后将其导入到我的当前文件中,但是我似乎无法执行更新的代码。它仅执行已加载的第一个版本。
有一个名为的文件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)
还有其他不相关的代码可以检查文件是否已被修改等。
我可以说文件正在正确地重新加载,因为当我inspect.getsource(f.create_feature)
在类上使用它时,它会显示更新的源代码,但是在执行过程中,它会返回旧值。我已经通过更改打印语句以及比较返回值来验证了这一点。
另外,对于更多上下文,我正在尝试导入文件:
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])
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句