Как динамически перезагрузить функцию в Python? - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь создать процесс, который динамически просматривает записные книжки 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]

Эта функция вызывается by:

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)

Существует другой не относящийся к делу код, который проверяет, был ли файл изменен и т. д. c.

Я могу сказать, что файл перезагружается правильно, потому что когда я использую 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"

Мне было интересно, что Я делал неправильно?

1 Ответ

0 голосов
/ 07 февраля 2020

Итак, я выяснил, что я делаю неправильно.

При вызове reload я перезагружал только что импортированный модуль, что, как я полагаю, было довольно идиотским c. Правильным решением (в моем случае) было перезагрузить модуль из sys.modules, так что это было бы что-то вроде reload(sys.modules[COMPILED_MODULE + "." + name])

...