मैं एक ऐसी प्रक्रिया बनाने की कोशिश कर रहा हूं जो गतिशील रूप से ज्यूपिटर नोटबुक देखता है, उन्हें संशोधन पर संकलित करता है और उन्हें मेरी वर्तमान फ़ाइल में आयात करता है, हालांकि मैं अद्यतन कोड निष्पादित नहीं कर सकता। यह केवल लोड किए गए पहले संस्करण को निष्पादित करता है।

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"

मैं सोच रहा था कि मैं गलत क्या कर रहा था?

0
aphsai 7 फरवरी 2020, 01:46

1 उत्तर

सबसे बढ़िया उत्तर

तो मुझे पता चला कि मैं क्या गलत कर रहा था।

जब reload को कॉल किया गया तो मैं उस मॉड्यूल को फिर से लोड कर रहा था जिसे मैंने हाल ही में आयात किया था, जो मुझे लगता है कि काफी मूर्खतापूर्ण था। सही समाधान (मेरे मामले में) मॉड्यूल को sys.modules से पुनः लोड करना था, इसलिए यह कुछ इस तरह होगा reload(sys.modules[COMPILED_MODULE + "." + name])

0
aphsai 7 फरवरी 2020, 15:36