Python 3.3中的包不需要初始化py吗+

2024-05-15 23:18:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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文件夹时,ab中都需要有__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时,它工作得很好。


Tags: nopyimporthomeobjectfooinitpython3
3条回答

重要

@Mike的回答是正确的,但太不精确了。Python 3.3+确实支持隐式命名空间包,允许它创建不带__init__.py文件的包。

但是,这仅适用于__init__.py文件。因此,__init__.py文件不再是必需的,可以省略。如果要在导入包或其任何模块或子包时运行特定的初始化脚本,仍然需要一个__init__.py文件。这是一个很好的Stack Overflow answer文件,您可以使用__init__.py文件进行进一步的初始化,以防您想知道这为什么有用。

目录结构示例:

  parent_package/
     __init__.py            <- EMPTY, NOT NECESSARY in Python 3.3+
     child_package/
          __init__.py       <- STILL REQUIRED if you want to run an initialization script
          child1.py
          child2.py
          child3.py

parent_package/child_package/__init__.py

print("from parent")

示例

下面的示例演示了在导入child_package或其模块之一时如何执行初始化脚本。

示例1:

from parent_package import child_package  # prints "from parent"

例2:

from parent_package.child_package import child1  # prints "from parent"

如果项目中有setup.py,并且在项目中使用find_packages(),则必须在每个目录中都有一个__init__.py文件,才能自动找到包。

Packages are only recognized if they include an __init__.py file

UPD:如果要使用不带__init__.py的隐式命名空间包,只需使用find_namespace_packages()即可

Docs

Python 3.3+有Implicit Namespace Packages允许它创建没有__init__.py文件的包。

Allowing implicit namespace packages means that the requirement to provide an __init__.py file can be dropped completely, and affected ... .

使用__init__.py文件的旧方法仍然像在Python 2中一样工作。

相关问题 更多 >