python - 插件模式+子命令

标签 python command-line argparse

我将制作一个具有插件功能的命令行应用程序,每个新插件都将由 __main__.py 脚本中的子命令调用。

我曾经使用argparse,我想知道是否可以使用argparse来实现子命令+插件(我找到了一些工具,但使用了已弃用的包)?

myfantasticCLI
├── __main__.py
└── plugins
    ├── create.py
    ├── notify.py
    └── test.py

我知道我可以使用argparse作为子命令,但不知道如何以动态加载的方式使用它。 :/

最佳答案

如果您使用以下命令初始化 argparse 子解析器

sp = parser.add_subparsers(dest='cmd',...)

然后解析后 args.cmd 将是所选子解析器或命令的名称。

然后一个简单的 if 树可以导入并运行所需的模块

cmd = args.cmd
if cmd in ['module1',...]:
   import plugins.module1 as mod:
   mod.run(...)
elif cmd in ['module2',....]:
   import plugins.module2 as mod:
   ...

有更奇特的方法可以做到这一点,但我更喜欢从显而易见的开始。

此外,我的重点是从解析器获取 cmd 名称,而不是导入给定名称的模块的详细信息。您不需要 argparse 来测试问题的导入给定名称部分。

关于python - 插件模式+子命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36986250/

相关文章:

python - 我的代码中的@register.filter

java - 从 VLC 命令行获取正在播放信息

firefox - 从 shell 脚本在特定的 Firefox 实例中打开一个新选项卡

r - 在R中从命令行执行脚本时出现问题。错误消息: cannot find path specified

python - 多次指定参数时显示错误

python - 计算数组中某个值的平均位置快速方法

python - python中的多线程 - 阻止调用在后台运行

Python - 按照命令写入文件

python - 在 Python 的 argparse 中设置输出的行长

python - 如何让 argparse 使用选项而不是前缀从文件中读取参数