如何在导入同一子目录中的另一个模块的子目录中导入模块?

3
在我导入的一个模块中,我试图导入另一个模块,该模块位于同一目录中。
我的文件看起来像这样...
project
├── main.py
└── app
    └── foo.py
    └── bar.py

main.py

import app.foo as Foo

foo.py

import bar

因此,现在当我运行main.py时,我会得到一个。
ModuleNotFoundError: No module named 'bar'

有很多类似的问题,但似乎没有一个是我确切的情况。

我该如何让它工作?


2
from . import bar 可以解决问题,但我不确定这是否是推荐的方式 :) - NiziL
可能是 Python 模块的绝对导入和显式相对导入 的重复问题。 - moooeeeep
相关文档部分:https://docs.python.org/3/tutorial/modules.html#packages,特别是:https://docs.python.org/3/tutorial/modules.html#intra-package-references - moooeeeep
相关链接:https://dev59.com/E2Yq5IYBdhLWcg3wxTWq - moooeeeep
2个回答

3

应该可以从 .. 或 . 导入:

from . import bar 

请记得在app目录中添加一个名为__init__.py的空文件。

编辑:只有在使用foo和bar作为模块时才能完成此操作。例如,您将无法运行“python foo.py”或“python foo.bar”。如果在app目录以外,请尝试以下代码:
python -m app.foo

(注意缺少.py扩展名)


0
这主要是因为当直接运行main.py时,Python 会使用main.py所在的目录作为当前运行目录,因此当你在foo.py中直接import bar时,Python 解释器会尝试在该运行目录中查找bar模块,而明显不存在bar.py。这就是为什么需要相对引用的原因,正如@Robert Szczelina所回答的那样。
如果你直接运行foo.py,那么语句import bar就是正确的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接