我正在使用 Python 3.5.1。我在这里阅读了文档和包部分:https ://docs.python.org/3/tutorial/modules.html#packages
现在,我有以下结构:
/home/wujek/Playground/a/b/module.py
module.py:
module.py
class Foo: def __init__(self): print('initializing Foo')
现在,在/home/wujek/Playground:
/home/wujek/Playground
~/Playground $ python3 >>> import a.b.module >>> a.b.module.Foo() initializing Foo <a.b.module.Foo object at 0x100a8f0b8>
同样,现在在家里,超级文件夹Playground:
Playground
~ $ PYTHONPATH=Playground python3 >>> import a.b.module >>> a.b.module.Foo() initializing Foo <a.b.module.Foo object at 0x10a5fee10>
实际上,我可以做各种各样的事情:
~ $ PYTHONPATH=Playground python3 >>> import a >>> import a.b >>> import Playground.a.b
为什么这行得通?我虽然需要有__init__.py文件(空的可以工作)a并且当Python路径指向文件夹时可以b导入?module.py``Playground
__init__.py
a
b
module.py``Playground
这似乎已经从 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
两者__init__.py兼而有之,效果很好。~/Playground/a``~/Playground/a/b
~/Playground/a``~/Playground/a/b
Python 3.3+ 具有隐式命名空间包,允许它创建没有__init__.py文件的包。
允许隐式命名空间包意味着 可以完全放弃*__init__.py提供文件的要求,并影响…。 *
使用文件的旧方法__init__.py仍然可以在 Python 2 中使用。