了解绝对和相对进口

时间:2014-12-11 19:59:54

标签: python

我正在尝试从另一个模块中的文件导入一个函数,但一直收到以下错误。

ValueError: Attempted relative import in non-package

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

ImportError: No module named app.main.events

我的文件结构

\_ dir
    \_ __init__.py
    \_ app
        \_ main
            \_ __init__.py
            \_ events.py
        \_ game
            \_ __init__.py
            \_ run.py

events.py

def my_function():
    do something....

run.py

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

我无法看到我出错的地方......这可能是非常简单的事情。

1 个答案:

答案 0 :(得分:0)

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

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

也无法记住是否有必要,但您可能在app子目录中缺少__init__.py。