I am using Python 3.5.1. I read the document and the package section here: https://docs.python.org/3/tutorial/modules.html#packages
Now, I have the following structure:
/home/wujek/Playground/a/b/module.py
module.py:
class Foo:
def __init__(self):
print('initializing Foo')
Now, while in /home/wujek/Playground:
~/Playground $ python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
Similarly, now in home, superfolder of Playground:
~ $ PYTHONPATH=Playground python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
Actually, I can do all kinds of stuff:
~ $ PYTHONPATH=Playground python3
>>> import a
>>> import a.b
>>> import Playground.a.b
Why does this work? I though there needed to be __init__.py files (empty ones would work) in both a and b for module.py to be importable when the Python path points to the Playground folder?
This seems to have changed from Python 2.7:
~ $ PYTHONPATH=Playground python
>>> import a
ImportError: No module named a
>>> import a.b
ImportError: No module named a.b
>>> import a.b.module
ImportError: No module named a.b.module
With __init__.py in both ~/Playground/a and ~/Playground/a/b it works fine.
解决方案
Python 3.3+ has Implicit Namespace Packages that allow it to create a packages without an __init__.py file.
Allowing implicit namespace packages means that the requirement to provide an __init__.py file can be dropped completely, and affected ... .
The old way with __init__.py files still works as in Python 2.