UNSOLVED How to share living instance?



  • Hi,
    I have this extension and I would like to share its instance for other parts of the extension so they can operate it from separate files.

    import gc
    
    def objectByClass(searchedClass):
        for obj in gc.get_objects():
            if obj.__class__.__name__ == searchedClass.__name__:
                return obj
        else:
            print('not found')
            return None
    

    This works, but looks and feels a bit scary. as I am not really that experienced, I can't say when it can go wrong. It finds living instance of a observing class.

    This is another approach when setting it into the main file

    import __main__ 
    setattr(__main__, 'testjeee', 30)
    

    that can be later accessed after importing __main__.

    Is there maybe a recommended way how to push it to RoboFont's globals? Or is the second safe enough? Thanks!


  • admin

    hello @jansindl3r,

    not sure I understand the question…

    if you create an instance in a module and assign it to a variable, it becomes available in the module’s namespace like any other object:

    # myModule.py
    class MyClass:
        pass
    myInstance = MyClass()
    
    # myScript.py
    import myModule
    print(myModule.myInstance)
    
    <myModule.MyClass object at 0x1248ee910>
    

    if this is not working for you, try reloading the module:

    from importlib import reload
    import myModule
    reload(myModule)
    

    btw gc is an existing module in Python (Garbage Collector), this may lead to conflicts.

    hope this makes sense! cheers



  • hi, @gferreira!
    Yes I was using gc to get the instance, but it seems too risky.
    I went for the __main__ approach.

    Well, this doesn't work for me. It import's the class but not the latest instance.

    address of the latest instance that I am interested in is 4551262352
    while imported's address is 4609259344 so those are two different things.
    I doubt that it be so easy while such things are solved through socket communication, aren't they?
    The approach that you described would work if the second file initialized the first imported one, which it can't. "I think - I am not sure :/ "

    so I have collected 3 approaches

    • searching in gc, either based on address or name = dangerous
    • setting link through __main__ = fine
    • setting up protocol communication = too much work

    I will go for the second one
    thanks, Jan


  • admin

    Dont get it why Gustavo's answer does not work...

    You initiate only once an instance from that class and import it back into other modules.

    A fourth easy solution is to add a variable to NSApp()

    import AppKit
    
    app = AppKit.NSApp()
    app._my_extenstion_name_controller = "foo"
    

    this will be accessible everywhere, but this is actually the same as Gustavo's answers, just stored somewhere else :)