Python:导入包含的包

Posted

技术标签:

【中文标题】Python:导入包含的包【英文标题】:Python: import the containing package 【发布时间】:2010-09-30 23:49:03 【问题描述】:

在位于包内的模块中,我需要使用在该包的__init__.py 中定义的函数。如何在包中的模块中导入包,以便我可以使用该功能?

在模块内部导入__init__不会导入包,而是导入一个名为__init__的模块,导致两个不同名称的东西副本...

有没有pythonic方法可以做到这一点?

【问题讨论】:

【参考方案1】:

另外,从 Python 2.5 开始,相对导入是可能的。例如:

from . import foo

引用http://docs.python.org/tutorial/modules.html#intra-package-references:


从 Python 2.5 开始,除了上面描述的隐式相对导入之外,您还可以使用 import 语句的 from module import name 形式编写显式相对导入。这些显式的相对导入使用前导点来指示相对导入中涉及的当前包和父包。例如,从周围的模块中,您可以使用:

from . import echo
from .. import formats
from ..filters import equalizer

【讨论】:

这里没有回答如何从__init__.py导入的问题。 @BrenBarn:但这是导入它的方式;当您导入 package 时,__init__.py 文件用作有效的命名空间。你不应该直接导入__init__.py【参考方案2】:

这并不能完全回答您的问题,但我建议您将函数移到 __init__.py 文件之外,并移到该包内的另一个模块中。然后,您可以轻松地将该功能导入您的其他模块。如果需要,您可以在 __init__.py 文件中添加一个 import 语句,该语句也将导入该函数(在导入包时)。

【讨论】:

我意识到我可以做到这一点,只是看起来相当混乱,嗯,unpythonic。 不确定这是“unpythonic”吗?由于 init.py 不是真正的模块,替代方案会不会更加混乱? +1 - 在你的包中使用 common.py 在 Python 中是非常常见的做法。 我一直在胡闹,没有找到更好的方法【参考方案3】:

如果包名为testmod,因此您的初始化文件为testmod/__init__.py,并且包中的模块为submod.py,那么在submod.py 文件中,您应该只能说import testmod 并使用在 testmod 中定义的任何你想要的东西。

【讨论】:

【参考方案4】:

我不完全确定是什么情况,但这可能会解决您的“不同名称”问题:

import __init__ as top
top.some_function()

或者也许?:

from __init__ import some_function
some_function()

【讨论】:

这确实有效,但至少在 cPython 2.7 中,解释器认为 __init__top 是不同的模块,因此 __init__.py 文件被加载两次。 这是一个隐式的相对导入,因此在 python 3 中不起作用,在 python 2 中也是不好的做法。 这仍然会创建sys.modules['__init__']。基本上,__init__.py 模块不应该直接导入。而是导入包(目录名称)。【参考方案5】:

在 Django 中,文件 manage.py 有 from django.core.management import execute_manager,但 execute_manager 不是模块。它是management 目录的__init__.py 模块中的一个函数。

【讨论】:

以上是关于Python:导入包含的包的主要内容,如果未能解决你的问题,请参考以下文章

Python 3:从***包导入模块

Python 包内的导入问题(绝对导入和相对导入)

AWS Lambda Python3.7 函数 - numpy:无法导入名称“WinDLL”

模块的导入

python导入import

Java常用包都有哪些?