【问题标题】:Importing modules dynamically in Python 3.X在 Python 3.X 中动态导入模块
【发布时间】:2020-11-19 16:52:18
【问题描述】:

我想从函数内部导入一个模块。例如来自这个:

from directory.folder.module import module

def import():   
    app.register_blueprint(module)

到这里:

def import():   
    from directory.folder.module import module

但是,没有硬编码。例如:

def import():
    m = "module"
    from directory.folder.m import m

有可能吗?提前致谢

【问题讨论】:

  • 我想知道用例是什么。
  • 你想要importlib 模块。
  • @VighneshRaut 我想用 Flask 注册蓝图,而不是每次都写下引用蓝图模块的导入。

标签: python python-import


【解决方案1】:

你想要importlib 模块。

这是使用此模块的最简单的方法。有很多不同的方法可以将模块调用的结果编织到环境中:

import importlib

math = importlib.import_module("math")

print(math.cos(math.pi))

结果:

-1.0

我经常使用这个库。我用它构建了一个完整的插件部署系统。所有各种部署的脚本都放在目录中,并且仅在配置文件中提到它们时才导入,而不是必须立即导入所有内容。

我觉得这个模块很酷的一点是它的文档顶部的说明:

importlib 包的目的有两个。一种是在 Python 源代码中提供 import 语句的实现(进而扩展为 import() 函数)。

2.7 文档中的介绍也很有趣:

2.7 版中的新功能。

此模块是 Python 3.1 中功能更全面的同名包中可用功能的一个小子集,它提供了完整的导入实现。此处提供的内容有助于轻松从 2.7 过渡到 3.1。

【讨论】:

  • 嗯,我一直这么认为。但这不是一个“非法”的答案吗?
  • 所以,我想你的答案是最安全的,但由于某种原因,它似乎不适用于我的具体情况。也许我做错了什么,它可能是。我用 Wasif 的答案解决了。非常感谢您,我感谢您的努力,我希望您的回答仍然是最重要的!
  • @BigMeister m = getattr(importlib.import_module('directory.folder.m'), 'm') 怎么样?
  • @superbrain 太棒了!这正是我想看到的。奇迹般有效! :D
  • @BigMeister 顺便说一句,来自here,这是 Python 2 的旧答案,但显然仍然正确。
【解决方案2】:

不,python import 不能这样工作。

例如,您尝试导入名为mod 的模块,因此您运行import mod。现在解释器将在从以下来源收集的目录列表中搜索 mod.py

  • 运行输入脚本的目录或当前目录(如果解释器以交互方式运行)。

  • PYTHONPATH 环境变量中包含的目录列表(如果已设置)。 (PYTHONPATH 的格式取决于操作系统,但应该模仿 PATH 环境变量。)

  • 安装 Python 时配置的依赖于安装的目录列表。

因此,如果您有一个名为m='mod' 的变量并运行import m,它将搜索m.py 而不是mod.py

但只是一个愚蠢的危险解决方法是使用exec()恶意输入警告

m = "module"
exec(f'from directory.folder.m import {m}')

如果您不介意外部模块,请尝试importlib

【讨论】:

    【解决方案3】:

    您可以使用 importlib 模块以编程方式导入模块。

    import importlib
    
    full_name = "package." + "module"
    
    m = importlib.import_module(full_name)
    

    【讨论】:

      猜你喜欢
      • 2019-06-04
      • 2013-07-05
      • 1970-01-01
      • 2011-04-17
      • 2019-10-07
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      相关资源
      最近更新 更多