【问题标题】:Python -- import the package in a module that is inside the same packagePython -- 在同一个包内的模块中导入包
【发布时间】:2012-05-25 17:43:46
【问题描述】:

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

/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

相关链接

【问题讨论】:

  • 如果你放一些代码来澄清__main__这件事会有所帮助。

标签: python


【解决方案1】:

您可以从out.py 执行import some_app.mod2,因为它与您的some_app 包位于同一目录中,Python 解释器开始从该路径查找模块。

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

【讨论】:

    【解决方案2】:

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

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


    编辑:

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

    【讨论】:

    • 不鼓励使用from . import *。但这确实在mod1.py 中得到了from . import mod2 的正确答案。见python.org/dev/peps/pep-0328
    • 我想我的意思是 * 在这里作为通配符,而不是文字语法
    • from . import some_module 在 Python 2.7 中抛出 ImportError: cannot import name some_module,有或没有 absolute_import
    • 你也可以from .some_module import my_function只导入你想要的函数。
    【解决方案3】:

    似乎“from .import some_module”仅适用于 Python3。

    通用方法是在 init.py

    中进行所有导入

    【讨论】:

    • 不正确 - from . import some_module 在 python 2.7 中工作得很好
    • 好的,-3,但是最好的方法是在 init.py 中进行导入是真的吗?
    猜你喜欢
    • 2018-04-29
    • 1970-01-01
    • 2021-06-24
    • 2020-06-22
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 2019-11-22
    相关资源
    最近更新 更多