如何动态导入模块并将其名称作为字符串?

2024-03-14

我正在编写一个 Python 应用程序,它将命令作为参数,例如:

$ python myapp.py command1

我希望应用程序是可扩展的,也就是说,能够添加实现新命令的新模块,而无需更改主应用程序源。这棵树看起来像:

myapp/
    __init__.py
    commands/
        __init__.py
        command1.py
        command2.py
    foo.py
    bar.py

因此,我希望应用程序在运行时找到可用的命令模块并执行适当的命令模块。

Python 定义了一个__import__()函数,它接受一个字符串作为模块名称:

__import__(name, globals=None, locals=None, fromlist=(), level=0)

该函数导入模块name,可能使用给定的globals and locals确定如何在包上下文中解释名称。这fromlist给出应从给定模块导入的对象或子模块的名称name.

Source: https://docs.python.org/3/library/functions.html#__import_ https://docs.python.org/3/library/functions.html#__import__

所以目前我有类似的东西:

command = sys.argv[1]
try:
    command_module = __import__("myapp.commands.%s" % command, fromlist=["myapp.commands"])
except ImportError:
    # Display error message

command_module.run()

这工作得很好,我只是想知道是否有可能有一种更惯用的方法来完成我们用这段代码所做的事情。

请注意,我特别不想使用鸡蛋或扩展点。这不是一个开源项目,我不希望有“插件”。重点是简化主要应用程序代码,并且无需在每次添加新命令模块时修改它。


See also: How do I import a module given the full path? https://stackoverflow.com/questions/67631


对于早于 2.7/3.1 的 Python,这几乎就是您的做法。

对于较新的版本,请参阅importlib.import_module for Python 2 https://docs.python.org/2/library/importlib.html#importlib.import_module and Python 3 https://docs.python.org/3/library/importlib.html#importlib.import_module.

或者使用__import__您可以通过执行以下操作导入模块列表:

>>> moduleNames = ['sys', 'os', 're', 'unittest'] 
>>> moduleNames
['sys', 'os', 're', 'unittest']
>>> modules = map(__import__, moduleNames)

直接从深入Python http://web.archive.org/web/20120315061111/http://www.diveintopython.net/functional_programming/dynamic_import.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何动态导入模块并将其名称作为字符串? 的相关文章

随机推荐

  • 如何检测任何类型的用户交互?

    安全问题 我现在不知道这是如何发生的 但这个问题的读者会想到这个问题的解决方案是一种安全威胁 所以请记住 我感兴趣的所有数据都是测量用户进入 活动的时间 就这样 用户做了什么 我是NOT有兴趣 我需要的是非常简单的概念 但我找不到解决方案
  • 发送文件到 Mule 入站端点

    我正在尝试将包含文件和两个输入的表单发送到 Mule 入站端点 我有一个自定义处理器和一个定义如下的流程
  • 如何在ggplot中缩放独立层的颜色?

    我有一个数据集 记录了三座建筑物的能源使用情况 我有一个融化的数据框 可以从钻石组中模仿 data lt melt diamonds c depth table cut color id c cut color 本质上 我有来自三个不同建筑
  • Stripe 订阅取消和重新激活模型的最佳实践

    我正在开发一个应用程序 该应用程序有 Stripe 的每月订阅计划 我正在创建一个客户然后订阅供用户订阅 这对我来说效果很好 但我还没有弄清楚如何使用 Stripe 订阅创建取消流程 我使用了取消订阅按钮stripe subscriptio
  • 目标元素位于其他元素之前

    在我对此进行研究的过程中 我偶然发现这个线程 https stackoverflow com questions 10225364 select specific element before other element 但由于它已有 2
  • 用户完成编辑后如何从 EditText 上移除焦点?

    我的布局上有一个 EditText 用户输入一些文本并点击 完成 键后 我想从中删除闪烁的光标 我搜索了 StackOverflow 并找到了 3 个对我不起作用的答案 闪烁的光标仍然存在 private class MyOnKeyList
  • 虚拟环境下降级Python版本

    关于 TensorFlow 我总是遇到同样的错误 ModuleNotFoundError No module named tensorflow contrib 我实际上使用的是Python版本3 9不过网上看的好像是这个版本3 7是最后一个
  • 从 WHERE 子句中包含 Varying IN 列表的表中进行 SELECT

    我在正在处理的项目中遇到一个问题 我无法给您实际的代码 但我创建了一个可执行的示例代码 如下所示 Here temp and temp id有两张桌子 temp表包含逗号分隔的 id 列表 即VARCHAR2 temp id表包含实际的 i
  • 如何从散列的散列中提取键名?

    我有以下哈希值 HoH flintstones gt husband gt fred pal gt barney jetsons gt husband gt george wife gt jane his boy gt elroy simp
  • phpseclib 给了我一个奇怪的错误

    我试图使用这个 但它只是给了我这个错误 我不知道如何解决这个问题 警告 include once Math BigInteger php 无法打开流 否 这样的文件或目录 home www sfs web statistics public
  • linq .Value 可空对象必须有一个值。如何跳过?

    我有一些 linq 代码 有时null cbo3 ItemsSource empty Union from a in from b in CompleteData select b TourOpID Distinct select new
  • 在Swift中实现UILabel动画效果的最佳方法?

    我对 Swift 动画还很陌生 并且知道如何去做 但想看看其他人会如何做 我正在尝试创建这样的效果 当用户进入搜索栏时 搜索栏的占位符文本会缩小并向上移动到搜索字段上方 并更改为不同的颜色 像这样 http magicus xyz http
  • [String] 的 Swift 扩展?

    我正在尝试编写一个扩展方法 String 看来你不能延长 String 直接 类型 元素 限制为非协议类型 字符串 尽管我遇到了这个技巧 protocol StringType extension String StringType 但我仍
  • 在世界地图上方可视化网络[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我在 NodeXL 中有一个网络数据集 我试图在世界地图上可视化它 我的数据集有 具有国家属性的节点 链接 节点之间的未加权连接 我尝
  • 如何在 MATLAB 中迭代 n 维矩阵中的每个元素?

    我有个问题 我需要在 MATLAB 中迭代 n 维矩阵中的每个元素 问题是 我不知道如何对任意数量的维度执行此操作 我知道我可以说 for i 1 size m 1 for j 1 size m 2 for k 1 size m 3 等等
  • 使用 Angular 4.4.6 的开发模式下没有 NgForm 错误提供程序

    EDIT 我已经发现是什么导致了这个问题 我现在正在寻找一个解决方案来满足它 NOTE 此问题发生在开发模式下 即不是生产模式 并且不使用 aot 我正在使用这里的 更新 解决方案 https stackoverflow com a 463
  • 带css的透明滚动条

    现在使用此代码 以及此代码的许多变体 但滚动轨道变为深灰色 例如 222222 或接近此颜色 找到很多例子 但它们都给出相同的结果 Opera Chrome 和 Firefox 均显示此错误 怎么修 style 3 webkit scrol
  • HSTS 安全标头中的 max-age 属性是什么?

    HSTS 中 max age 的目的是什么 例如 Strict Transport Security max age 100 如果该值超过 100 会发生什么 有没有设置 max age 的最佳实践 thanks 有语义上不同的方式来发送
  • MPI:广播 long long int

    这个程序估计Pi通过将随机 飞镖 采样点 扔到一个圆或半径 1内切于长度 2的方板内的圆上 利用关系 Area of circle Area of Square Pi 4 我们可以使用表示为的相同关系来估计 Pi Darts Inside
  • 如何动态导入模块并将其名称作为字符串?

    我正在编写一个 Python 应用程序 它将命令作为参数 例如 python myapp py command1 我希望应用程序是可扩展的 也就是说 能够添加实现新命令的新模块 而无需更改主应用程序源 这棵树看起来像 myapp init