53

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

/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 项目中,这就是他们正在做的事情。例如看这个文件

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

更新 2

相关链接

4

3 回答 3

49

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

你还可以import mod1。我假设你需要some_app/__init__.py跑步。不确定这是否可能。


编辑:

看起来from . import some_module会做你所追求的。

于 2012-05-18T06:57:50.247 回答
2

You can do import some_app.mod2 from out.py because it is in the same directory that you have some_app package, and Python interpreter starts to look for modules from that path.

The import error in mod2.py is normal because there is not a some_app package in mod2.py folder.

于 2012-05-18T06:53:42.060 回答
-7

似乎“from .import some_module”仅在 Python3 中有效。

通用方法是在init .py中进行所有导入

于 2018-03-09T19:54:00.137 回答