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

Posted

技术标签:

【中文标题】如何使用 importlib.import_module 在 Python 中导入模块【英文标题】:How to import a module in Python with importlib.import_module 【发布时间】:2012-05-27 08:26:23 【问题描述】:

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

考虑以下目录结构:

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

a/b/__init__.py 的代码如下:

导入导入库 mod = importlib.import_module("c")

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

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

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

我错过了什么?

谢谢!

【问题讨论】:

【参考方案1】:

对于相对导入,您必须:

a) 使用相对名称

b) 明确提供锚点

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

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

当模块名是变量时很有用。 当模块名称不是有效的python标识符(例如,其中包含破折号)时,它也很有用。【参考方案3】:

别忘了为每个文件夹/子文件夹创建一个__init__.py(即使它们是空的)

【讨论】:

为什么?我发现了这个:***.com/questions/448271/what-is-init-py-for#448279 @TwoBItAlchemist 的评论最有用 我认为“”“Python 搜索目录列表以解析名称,例如 import 语句。因为这些可以是任何目录,并且可以添加任意目录对于最终用户,开发人员必须担心目录碰巧与有效的 Python 模块共享名称,例如 docs 示例中的 'string'。为了缓解这种情况,它会忽略不包含名为 _ 的文件的目录init _ _.py(无空格),即使它是空白的。"""

以上是关于如何使用 importlib.import_module 在 Python 中导入模块的主要内容,如果未能解决你的问题,请参考以下文章

如果加入条件,我该如何解决。如果使用字符串连接,我如何使用

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?