kuco 23
kuco 23

Reputation: 830

Importing python module, through __init__.py script

My directory structure is

app.py
lib
   __init__.py
   _foo.py

Inside __init__.py I have written

from . import _foo as foo

Then inside app.py I try to make a call

from lib.foo import *

but it throws ModuleNotFoundError: No module named 'lib.foo' exception.

Basically I want to import everything from _foo.py, through the __init__.py script. While I realize the code works if _foo.py is renamed into foo.py, I still wonder if there is any way to make import work through __init__.py.

Upvotes: 0

Views: 98

Answers (1)

tjholub
tjholub

Reputation: 714

Not sure about hacking around the import statements, but you could get away with something less explicit like this:

lib/__init__.py

from . import _foo as foo

__all__ = ['foo']

lib/_foo.py

__all__ = [
    'test'
]

test = 1

>>> from lib import *
>>> foo
<module 'lib._foo' from '/path/to/test/lib/_foo.py'>
>>> foo.test
1
>>> 

EDIT: You could achieve something more explicit by updating sys.modules at runtime:

app.py

import sys
from lib import _foo

sys.modules['lib.foo'] = _foo

lib/_foo.py

test = 1

keep lib/__init__.py to make lib a module

After importing app lib.foo will be an available module

>>> import app
>>> from lib import foo
>>> foo
<module 'lib._foo' from '/path/to/test/lib/_foo.py'>
>>> foo.test
1

Upvotes: 1

Related Questions