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

Zaa*_*Hai 57 python import module python-importlib

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

考虑以下目录结构:

    a
    |
    + - __init__.py
      - b
        |
        + - __init__.py
          - c.py

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

    import importlib

    mod = importlib.import_module("c")

(在实际代码中"c"有一个名字.)

试着import a.b,产生以下错误:

    >>> import a.b
    Traceback (most recent call last):
      File "", line 1, in 
      File "a/b/__init__.py", line 3, in 
        mod = importlib.import_module("c")
      File "/opt/Python-2.7.2/lib/python2.7/importlib/__init__.py", line 37, in   import_module
        __import__(name)
    ImportError: No module named c

我错过了什么?

谢谢!

Cat*_*lus 71

对于相对进口,您必须:

当然,你也可以做绝对导入:

importlib.import_module('a.b.c')
Run Code Online (Sandbox Code Playgroud)

  • 我可以像使用“import long_name as ln”那样重命名它吗? (5认同)
  • 您可以,只需为其指定一个名称,例如“abc = importlib.import_module('abc')” (2认同)

Ger*_*ald 22

我认为最好使用,importlib.import_module('.c', __name__)因为你不需要知道a和b.

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

  • 当模块名称是变量时,它很有用. (17认同)
  • 当模块名称不是有效的 python 标识符(例如其中包含破折号)时,它也很有用。 (3认同)

小智 11

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

  • 为什么呢?我发现这个:/sf/ask/31379001/#448279 @TwoBItAlchemist 的评论最有用我认为“”“Python搜索目录列表来解析名称例如,导入语句中。因为这些目录可以是任何目录,并且最终用户可以添加任意目录,所以开发人员必须担心碰巧与有效 Python 模块共享名称的目录,例如 in 中的“string”文档示例。为了缓解这个问题,它会忽略不包含名为 __ init __.py (无空格)的文件的目录,即使它是空白的。""" (2认同)