Import method from __init__.py

Cheese Puffs picture Cheese Puffs · Oct 30, 2016 · Viewed 11.1k times · Source

Having some issues with importing modules in python. This is my folder structure

my_app/
    app.py
    __init__.py (I want to import a function from this file)
    folder1/
        __init.py
        method1.py
    folder2/
        __init__.py
        method.py

In my root __init__.py I have this function

def want_to_be_run_elsewhere():
    pass

In my app.py, I want to import this function and run it when I start my application, but I'm unsure how to do it.

from my_app import want_to_be_run_elsewhere

This throws a no module named my_app

From what I can tell, I have all the necessary __init__.py files, so maybe it could be sys.path related?

I've read some similar threads on here but I haven't been able to solve this.

Answer

Nils Werner picture Nils Werner · Oct 30, 2016

Usually you would do the import like

from . import want_to_be_run_elsewhere

This doesn't work here, because you are calling app.py. If you import my_app.app, it is part of the module. If you call it it is not. Importing from the module it is in using . will then not work.

You could either move app.py outside of my_app, removing it from the module and making imports work again.

Or you can use

from __init__ import want_to_be_run_elsewhere

in app.py

I believe

from my_app import want_to_be_run_elsewhere

will only work if you have actually pip install -e my_app/. Then it should work too.