Python - 在同一个包中的模块中导入包

时间:2012-05-18 06:25:12

标签: python

我有一个像这样的项目结构......

/some_app
    build/
    README
    out.py
    some_app/
        __init__.py
        mod1.py
        mod2.py

现在我想将some_app包导入mod2,而不会弄乱sys.path诡计。我只是做了......

# mod2.py
import some_app

现在我从命令行运行mod2.py

some_app $ python mod2.py

它抛出错误ImportError: No module named some_app

但是,在out.py文件中,当我做

# out.py
import some_app.mod2

然后再做

some_app $ python out.py

它完美运行。

因此,正在发生的事情就是这样。我在一个位于同一个包中的模块中加载一个包,然后将该模块作为__main__文件运行 - 它不起作用。接下来,我在另一个模块中加载相同的模块(我作为__main__运行的模块),然后将另一个模块作为__main__运行 - 它可以工作。

有人可以详细说明这里发生了什么吗?

更新

我知道没有直接的理由这样做 - 因为我可以直接导入some_app包中的任何模块。我之所以这样做是因为,在Django项目中,这就是他们正在做的事情。见this file for example

在每个模块中,所有非标准导入均以django.开头。所以我想知道他们为什么以及如何做到这一点。

更新2

相关链接

3 个答案:

答案 0 :(得分:35)

mod2.pysome_app的一部分。因此,导入模块没有任何意义,因为您已经在其中。

你仍然可以import mod1。我假设您需要some_app/__init__.py才能运行。不确定是否可能。


编辑:

看起来from . import some_module会做你想做的事。

答案 1 :(得分:0)

您可以从import some_app.mod2执行out.py,因为它与some_app包位于同一目录中,并且Python解释器开始从该路径中查找模块。

mod2.py中的导入错误是正常的,因为some_app文件夹中没有mod2.py个包。

答案 2 :(得分:-5)

似乎“from.import some_module”仅适用于Python3。

通用方法是在 init .py

中执行所有导入
相关问题