如何在包内导入模块

How to import module inside package

文件夹结构:

foo/
  bar.py
  __init__.py
test.py

foo/__init__.pyimport bar

我是 运行 test.py 其中有 import foo


如何让 __init__.py 导入 bar.py

ModuleNotFoundError: No module named 'foo'

为什么 Python 不为我的包创建一个新范围并将导入的根设为 foo 目录?

相对路径似乎也不起作用(我收到 SyntaxError),尽管我正在寻找允许绝对路径的解决方案。

import .bar

两个不可接受的答案:


也许有一个解决方案可以将这个包的目录添加到仅针对该包范围的路径,在 __init__.py?

中的某处

好的,所以你在 import bar 中的 __init__.py 文件中有错误,对吗?

好吧,这不应该爆炸,但一个简单的替代方法是 from . import bar

编辑
我了解错误是由于层次结构而发生的,并且 __init__.py 具有顶级层次结构。
我找到了以下 article of great help. Also see 这个问题的答案。

根据 PEP 328import X 语法纯粹用于绝对导入;因为 bar 不是这里的顶级模块,所以唯一有效的 import X 语法是 import foo.bar.

foo__init__.py 导入 bar 的正确方法是:

from . import bar

你关于想要 "absolute paths",但又想要 import .bar 这样的东西的观点是不可能的;即使 import .bar 有效,这显然是一个相对路径(因为它只相对于执行它的模块才有意义;如果在 foo 包之外导入,.bar 就没有意义) .

至于"Why does Python not create a new scope for my package and make the root for imports the foo directory?",简单的例子就是想象你的子模块被命名为math,而不是bar。什么作用:

import math

在这种情况下是什么意思?如果它意味着你的子模块,你如何获得内置的顶级 math 模块?这些问题(当我未能包含 from __future__ import absolute_import 时,我在 Python 2 代码中遇到过)是 为什么 PEP 328 和存在默认绝对导入;一种语法始终是绝对的(消除歧义),您可以在需要时使用相对导入语法来执行相对导入(也没有歧义)。