【问题标题】:Python 3 doesn't need __init__.py in this situation?Python 3 在这种情况下不需要 __init__.py 吗?
【发布时间】:2016-04-30 09:46:42
【问题描述】:

假设我有:

src/
    __init__.py
    a.py
b.py

假设__init__.py是一个空文件,而a.py只是一行:

TESTVALUE = 5

假设b.py 是:

from src import a

print(a.TESTVALUE)

现在在 Python 2.7 和 Python 3.x 中,运行 b.py 会得到结果 (5)。

但是,如果我删除文件 __init__.pyb.py 在 Python 3.x 中仍然有效,但在 Python 2.7 中,我收到错误:

Traceback (most recent call last):
  File "b.py", line 5, in <module>
    from src import a
ImportError: No module named src

为什么 Python 2.7 在这种情况下会表现出不同的行为?

【问题讨论】:

    标签: python python-2.7 python-3.x import


    【解决方案1】:

    Python 3 支持namespace packages,无需__init__.py 文件即可工作。 此外,这些包可以分布在多个目录中。这意味着您的sys.path 上包含*.py 文件的所有目录都将被识别为包。

    这破坏了 Python 3 在导入方面的向后兼容性。一个典型的问题是当前工作目录中的一个目录,其名称类似于库,例如 numpy,并且包含 Python 文件。虽然 Python 2 会忽略此目录,但 Python 3 会首先找到它并尝试从那里导入库。这已经咬了我好几次了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      相关资源
      最近更新 更多