我正在使用Python3.5.1。我在这里阅读了文档和包部分:https://docs.python.org/3/tutorial/modules.html#packages
现在,我有以下结构:
/home/wujek/Playground/a/b/module.py
module.py
:
class Foo:
def __init__(self):
print('initializing Foo')
现在,在/home/wujek/Playground
中:
~/Playground $ python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x100a8f0b8>
类似地,现在在家里,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
为什么这么做?我认为当Python路径指向Playground
文件夹时,a
和b
中都需要有__init__.py
文件(空的文件可以工作)?
这似乎与Python2.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
时,它工作得很好。
重要
@Mike的回答是正确的,但太不精确了。Python 3.3+确实支持隐式命名空间包,允许它创建不带
__init__.py
文件的包。但是,这仅适用于空
__init__.py
文件。因此,空__init__.py
文件不再是必需的,可以省略。如果要在导入包或其任何模块或子包时运行特定的初始化脚本,仍然需要一个__init__.py
文件。这是一个很好的Stack Overflow answer文件,您可以使用__init__.py
文件进行进一步的初始化,以防您想知道这为什么有用。目录结构示例:
parent_package/child_package/__init__.py
:示例
下面的示例演示了在导入
child_package
或其模块之一时如何执行初始化脚本。示例1:
例2:
如果项目中有
setup.py
,并且在项目中使用find_packages()
,则必须在每个目录中都有一个__init__.py
文件,才能自动找到包。UPD:如果要使用不带
__init__.py
的隐式命名空间包,只需使用find_namespace_packages()
即可Docs
Python 3.3+有Implicit Namespace Packages允许它创建没有
__init__.py
文件的包。使用
__init__.py
文件的旧方法仍然像在Python 2中一样工作。相关问题 更多 >
编程相关推荐