关于python:了解绝对和相对导入

Understanding absolute and relative imports

我试图从另一个模块中的文件导入一个函数,但始终收到以下错误。

1
ValueError: Attempted relative import in non-package

我看过很多文章说做绝对的而不是相对的导入,但是得到了错误

1
ImportError: No module named app.main.events

我的文件结构

1
2
3
4
5
6
7
8
9
\_ dir
    \_ __init__.py
    \_ app
        \_ main
            \_ __init__.py
            \_ events.py
        \_ game
            \_ __init__.py
            \_ run.py

事件.py

1
2
def my_function():
    do something....

Py

1
2
3
4
5
6
7
from ..main.events import my_function
# returns
Attempted relative import in non-package

from app.main.events import my_function
# returns
No module named app.main.events

我看不出哪里出了问题…这可能是很简单的事情。


只要您在一个包中使用相对进口,并且是明确的,例如from . import foo就可以了。文章所说的不好的是,当您使用import foo并依赖一个名为foo.py的文件位于同一目录中时。

如果您直接执行python run.py,那么解释器不知道run.py是更大包的一部分。您要么需要使用python -m run.main将其作为模块运行,要么(在我看来)最好在set up.py中设置一个入口点。

也记不清是否有必要,但你可能在你的app子目录中缺少一个初始化.py。