python动态导入包的过程和简单的导入一个模块不大一样。

在当前文件导入模块会直接导入模块。嵌套import,例如A.B.C,会在locals中建立A,A.B,A.B.C三个模块,但是__import__(A.B.C)返回的是A模块。因此如果要得到A.B.C的话,需要这么做:

m_name = "A.B.C"
__import__(m_name)
c_module = sys.modules(m_name)  #


python模块之间的调用是比较严格的。虽然说 __import__(A.B.C) 会导入三个模块,但是必须 利用 sys.modules(m_name)  得到相应的模块才能用。

importlib的代码:

"""Backport of importlib.import_module from 3.x."""
# While not critical (and in no way guaranteed!), it would be nice to keep this
# code compatible with Python 2.3.
import sys

def _resolve_name(name, package, level):
    """Return the absolute name of the module to be imported."""
    if not hasattr(package, 'rindex'):
        raise ValueError("'package' not set to a string")
    dot = len(package)
    for x in xrange(level, 1, -1):
        try:
            dot = package.rindex('.', 0, dot)
        except ValueError:
            raise ValueError("attempted relative import beyond top-level "
                              "package")
    return "%s.%s" % (package[:dot], name)


def import_module(name, package=None):
    """Import a module.

    The 'package' argument is required when performing a relative import. It
    specifies the package to use as the anchor point from which to resolve the
    relative import to an absolute import.

    """
    if name.startswith('.'):
        if not package:
            raise TypeError("relative imports require the 'package' argument")
        level = 0
        for character in name:
            if character != '.':
                break
            level += 1
        name = _resolve_name(name[level:], package, level)
    __import__(name)
    return sys.modules[name]