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

tre*_*der 31 python

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

/some_app
    build/
    README
    out.py
    some_app/
        __init__.py
        mod1.py
        mod2.py
Run Code Online (Sandbox Code Playgroud)

现在我想导入some_appmod2,而不是搞乱sys.path诡计.我只是做了......

# mod2.py
import some_app
Run Code Online (Sandbox Code Playgroud)

现在,当我从命令行运行mod2.py时

some_app $ python mod2.py
Run Code Online (Sandbox Code Playgroud)

它会引发错误 ImportError: No module named some_app

但是,在out.py文件内部,当我这样做时

# out.py
import some_app.mod2
Run Code Online (Sandbox Code Playgroud)

然后呢

some_app $ python out.py
Run Code Online (Sandbox Code Playgroud)

它完美运行.

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

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

UPDATE

我知道没有直接的理由这样做 - 因为我可以直接导入some_app包内的任何模块.我之所以这样做是因为,在Django项目中,这就是他们正在做的事情.例如,请参阅此文件

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

更新2

相关链接

Eri*_*ric 39

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

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


编辑:

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

  • 我想我的意思是`*`作为通配符,而不是文字语法 (6认同)
  • 不鼓励使用from。导入*`。但这确实得到了from的正确答案。在mod1.py中导入mod2。参见https://www.python.org/dev/peps/pep-0328/ (2认同)