我有一个像这样的项目结构......
/some_app
build/
README
out.py
some_app/
__init__.py
mod1.py
mod2.py
Run Code Online (Sandbox Code Playgroud)
现在我想导入some_app包mod2,而不是搞乱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会做你想做的事情.