子模块的相对导入

时间:2012-01-17 10:41:14

标签: python import module python-3.x

在Python中,我如何执行以下

的等价物
import http.client

但使用相对导入:

from . import http.client
import .http.client

对于当前包中的包http?我想通过它的父名client访问http.client模块,因为如果我进行顶级导入,我将能够访问。

3 个答案:

答案 0 :(得分:3)

我会在相应的PEP 0328寻找灵感。如果您在http.__init__.py,并且想要访问客户端:

from . import client

答案 1 :(得分:2)

我认为您正在寻找的是:

from ..http import client

答案 2 :(得分:1)

您需要导入它     来自。导入http

但是,此时您将不会加载http.client模块,并且您无法访问它:

>>> http.client
AttributeError: 'module' object has no attribute 'client'

有各种方法来解决这个问题。最简单的方法是在http/__init__.py

中执行此操作
from . import client

你可以做的另一件事是

import types
http = types.ModuleType('http')

from .http import client
http.client = client

如果修改http/__init__.py

不切实际,您可以这样做

但是,由于我认为这是为了某些原因提供http.client的直接替换,我建议你这样做:

try:
    from .http import client
except ImportError:
    from http import client

然后一致地使用名称client。这绝对是最简单,最漂亮的解决方案

或者,如果您不想将客户端用作名称:

try:
    from .http import client as http_client
except ImportError:
    from http import client as http_client