如何在包内导入模块
How to import module inside package
文件夹结构:
foo/
bar.py
__init__.py
test.py
foo/__init__.py
有 import bar
我是 运行 test.py
其中有 import foo
如何让 __init__.py
导入 bar.py
?
ModuleNotFoundError: No module named 'foo'
为什么 Python 不为我的包创建一个新范围并将导入的根设为 foo
目录?
相对路径似乎也不起作用(我收到 SyntaxError
),尽管我正在寻找允许绝对路径的解决方案。
import .bar
两个不可接受的答案:
我无法使用 import foo.bar
。我需要 foo
包有自己独立的 layer/scope 以便我可以将它移动到我计算机的任何地方并从任何地方导入它。这意味着根可能会改变,import foo.bar
并不总是有效。
我无法将 foo
文件夹添加到我的路径中。显然,这会使路径混乱,并且很容易发生名称冲突。从开始的意义上说,这个包的文件应该与使用它的路径分开。
也许有一个解决方案可以将这个包的目录添加到仅针对该包范围的路径,在 __init__.py
?
中的某处
好的,所以你在 import bar
中的 __init__.py
文件中有错误,对吗?
好吧,这不应该爆炸,但一个简单的替代方法是 from . import bar
编辑
我了解错误是由于层次结构而发生的,并且 __init__.py
具有顶级层次结构。
我找到了以下 article of great help. Also see 这个问题的答案。
根据 PEP 328,import 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 和存在默认绝对导入;一种语法始终是绝对的(消除歧义),您可以在需要时使用相对导入语法来执行相对导入(也没有歧义)。
文件夹结构:
foo/
bar.py
__init__.py
test.py
foo/__init__.py
有 import bar
我是 运行 test.py
其中有 import foo
如何让 __init__.py
导入 bar.py
?
ModuleNotFoundError: No module named 'foo'
为什么 Python 不为我的包创建一个新范围并将导入的根设为 foo
目录?
相对路径似乎也不起作用(我收到 SyntaxError
),尽管我正在寻找允许绝对路径的解决方案。
import .bar
两个不可接受的答案:
我无法使用
import foo.bar
。我需要foo
包有自己独立的 layer/scope 以便我可以将它移动到我计算机的任何地方并从任何地方导入它。这意味着根可能会改变,import foo.bar
并不总是有效。我无法将
foo
文件夹添加到我的路径中。显然,这会使路径混乱,并且很容易发生名称冲突。从开始的意义上说,这个包的文件应该与使用它的路径分开。
也许有一个解决方案可以将这个包的目录添加到仅针对该包范围的路径,在 __init__.py
?
好的,所以你在 import bar
中的 __init__.py
文件中有错误,对吗?
好吧,这不应该爆炸,但一个简单的替代方法是 from . import bar
编辑
我了解错误是由于层次结构而发生的,并且 __init__.py
具有顶级层次结构。
我找到了以下 article of great help. Also see
根据 PEP 328,import 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 和存在默认绝对导入;一种语法始终是绝对的(消除歧义),您可以在需要时使用相对导入语法来执行相对导入(也没有歧义)。