Search code examples
pythonpython-importlib

import modules from __init__.py in another folder


I have the following project structure:

- workflow/
            file1.ipynb
            file2.ipynb
            ...
- utils/
        __init__.py
        function_one.py
        function_two.py
        ...

I am working on file1.ipynb, so far I have found a way to import the variables defined in init.py through the following code:

utils = importlib.machinery.SourceFileLoader('utils', '/home/utils/__init__.py').load_module()

Let's assume my __init__.py contains the following:

from .function_one import *

I can then use the variables defined inside the __init__.py file.

However, every time I want to call any of these variables I need to use the following syntax:

utils.function_one ...

I want to be able to write function_one without the utils at the beginning.

How can I import directly the variables defined inside the __init__.py ?


Solution

  • I don't know why you don't import your module with the normal import mechanism: from ..utils import * or depending on where your python interpreter was started just from utils import * but if you insist on using utils = importlib.machinery.SourceFileLoader('utils', '/home/utils/__init__.py').load_module() you can hack all values into your globals like this:

    tmp = globals()
    for attr_name in dir(utils):
        if not attr_name.startswith("_"): # don't import private and dunder attributes
            tmp[attr_name] = getattr(utils, attr_name)
    del tmp
    
    function_one(...) # should work now