我有一个像这样的项目结构......
/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
相关链接
答案 0 :(得分:35)
mod2.py
是some_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
中执行所有导入