如何使用importlib.import_module在Python中导入模块


75

我正在尝试importlib.import_module在Python 2.7.2中使用并遇到奇怪的错误。

考虑以下目录结构:

    一种
    |
    +-__init__.py
      -b
        |
        +-__init__.py
          -c.py

a/b/__init__.py 具有以下代码:

    导入importlib

    mod = importlib.import_module(“ c”)

(在真实代码中"c"有一个名称。)

尝试到时import a.b,产生以下错误:

    >>>导入ab
    追溯(最近一次通话):
      文件“”,第1行,位于 
      在第3行的文件“ a / b / __ init__.py”中 
        mod = importlib.import_module(“ c”)
      import_module中的文件“ /opt/Python-2.7.2/lib/python2.7/importlib/__init__.py”,第37行
        __import __(名称)
    ImportError:没有名为c的模块

我想念什么?

谢谢!

Answers:


94

对于相对进口,您必须:

  • a)使用相对名称
  • b)明确提供锚点

    importlib.import_module('.c', 'a.b')
    

当然,您也可以只执行绝对导入:

importlib.import_module('a.b.c')

31

我认为最好使用它,importlib.import_module('.c', __name__)因为您不需要了解ab

我也想知道,如果必须使用importlib.import_module('a.b.c'),为什么不使用import a.b.c


23
当模块名称是变量时,这很有用。
Bhargav Nanekalva 2015年

当模块名称不是有效的python标识符(例如,其中包含破折号)时,它也很有用。
fool4jesus

16

并且不要忘记为__init__.py每个文件夹/子文件夹创建一个(即使它们为空)


1
为什么呢 我发现了这一点:stackoverflow.com/questions/448271/what-is-init-py-for#448279,@TwoBItAlchemist的评论最有用,我认为“”“ Python搜索目录列表以解析名称,例如, import语句,因为它们可以是任何目录,并且最终用户可以添加任意目录,所以开发人员必须担心与有效Python模块共享名称的目录,例如docs示例中的“ string”。为了缓解这种情况,它会忽略不包含名为_ _ init _ _ _.py(无空格)的文件的目录,即使该目录为空也是如此。“”“
尼尔·麦吉尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.