【发布时间】:2010-09-30 23:49:03
【问题描述】:
在位于包内的模块中,我需要使用在该包的__init__.py 中定义的函数。如何在包中的模块中导入包,以便我可以使用该功能?
在模块内部导入__init__不会导入包,而是导入一个名为__init__的模块,导致两个不同名称的东西副本...
有没有pythonic方法可以做到这一点?
【问题讨论】:
标签: python module package python-import
在位于包内的模块中,我需要使用在该包的__init__.py 中定义的函数。如何在包中的模块中导入包,以便我可以使用该功能?
在模块内部导入__init__不会导入包,而是导入一个名为__init__的模块,导致两个不同名称的东西副本...
有没有pythonic方法可以做到这一点?
【问题讨论】:
标签: python module package python-import
另外,从 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导入的问题。
__init__.py 文件用作有效的命名空间。你不应该直接导入__init__.py。
这并不能完全回答您的问题,但我建议您将函数移到 __init__.py 文件之外,并移到该包内的另一个模块中。然后,您可以轻松地将该功能导入您的其他模块。如果需要,您可以在 __init__.py 文件中添加一个 import 语句,该语句也将导入该函数(在导入包时)。
【讨论】:
common.py 在 Python 中是非常常见的做法。
如果包名为testmod,因此您的初始化文件为testmod/__init__.py,并且包中的模块为submod.py,那么在submod.py 文件中,您应该只能说import testmod 并使用在 testmod 中定义的任何你想要的东西。
【讨论】:
我不完全确定是什么情况,但这可能会解决您的“不同名称”问题:
import __init__ as top
top.some_function()
或者也许?:
from __init__ import some_function
some_function()
【讨论】:
__init__ 与 top 是不同的模块,因此 __init__.py 文件被加载两次。
sys.modules['__init__']。基本上,__init__.py 模块不应该直接导入。而是导入包(目录名称)。
在 Django 中,文件 manage.py 有 from django.core.management import execute_manager,但 execute_manager 不是模块。它是management 目录的__init__.py 模块中的一个函数。
【讨论】: