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

60

我的项目结构大致如下...

/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

相关链接


如果您放置一些代码来澄清__main__的事情,那将会很有帮助。 - Diego Navarro
3个回答

59

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

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


编辑:

看起来from . import some_module可以实现您想要的效果。


5
不建议使用from . import *语句。但是,在mod1.py中使用from . import mod2语句是正确的做法。详见 https://www.python.org/dev/peps/pep-0328/。 - A.Wan
7
我认为这里的*应该理解为通配符,而不是字面上的语法。 - Eric
1
from . import some_module throws ImportError: cannot import name some_module in Python 2.7, with or without absolute_import - Jonathan Rys
你也可以使用 from .some_module import my_function 来仅导入你需要的函数。 - Smile

4

你可以使用 import some_app.mod2out.py 导入模块,因为它们在同一个目录下,而且 Python 解释器会从该路径开始查找模块。

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


-7

看起来 "from . import some_module" 只在 Python3 中有效。

通用的方法是在 init.py 中执行所有导入操作。


1
不正确 - from . import some_module 在 Python 2.7 中能够正常工作。 - Eric
1
好的,-3,但是最好的方法是在__init__.py中进行导入,这是真的吗? - Sandburg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接