如何使用系统参数构建“级联”CLI 工具?

Posted

技术标签:

【中文标题】如何使用系统参数构建“级联”CLI 工具?【英文标题】:How to build a 'cascading' CLI tool using system arguments? 【发布时间】:2019-02-09 22:00:45 【问题描述】:

这是我的示例代码:

def function1():

    parser = argparse.ArgumentParser(description='Test Cascading Utility')
    parser.add_argument('--number', type=str, help='Enter number')
    args = parser.parse_args()
    x = str(args.number)
    squares = float(x)**2

def function2():

    parser = argparse.ArgumentParser(description='Test Cascading Utility')
    parser.add_argument('--number1', type=str, help='Enter number')
    parser.add_argument('--number2', type=str, help='Enter number')
    args = parser.parse_args()
    x = str(args.number1)
    y = str(args.number2)
    div = float(x)/float(y)

def main():
    choice = sys.argv[1]
    if choice == 'Y':
        function1()
    elif choice == 'N':
        function2()
    else:
        print("Come on, choose a Y or N option.")

if __name__ == '__main__':
    main()

我正在尝试创建一个级联 cli 工具,其中基于我输入的一个选项,它运行一个特定的方法。该方法又将有自己的一组参数。 此特定代码引发错误:error: unrecognized arguments: Y 这让我认为“选择”系统参数正在被参数解析器覆盖,那么如何根据运行方法的选择来实现这种级联效果。

这是我第一次深入研究argparse,因此如果问题很愚蠢,请多多包涵。但这是我真正想要实现的。

【问题讨论】:

ArgumentParser 用于解析在运行时传递给应用程序的参数。当应用程序启动时,您只会得到这些参数。您不能像这样在单独的函数中创建单独的 ArgParsers 并期望它们具有值。 parse_args 看着sys.argv[1:]。您的 choice 在该列表中。您要么必须在调用函数之前将其删除,要么编写解析器以使其不会被该字符串阻塞。另一种可能性是将argv 列表传递给函数并使用parse_args(argv) 子解析器机制也可以处理这个 CLI。定义“Y”和“N”子解析器,并为每个子解析器提供所需的参数。 这应该会给你一些想法:***.com/questions/52103324/… 【参考方案1】:

我建议您使用点击。它使这些事情变得非常简单

http://click.pocoo.org/5/

您需要使用组,并且可能需要使用多命令链接

http://click.pocoo.org/5/commands/#group-invocation-without-command http://click.pocoo.org/5/commands/#multi-command-chaining

您可以创建组和子命令。 然后在每个子命令中调用您正在集成的原始函数。

【讨论】:

我无法真正更改函数,因为我要将其他人的代码集成到我的代码中。我不想对函数本身进行更改。我不认为 Click 可以帮助我实现这一点,如果可以的话,我想知道由于我之前使用过 click 并且我无法实现级联效果。 您错过了click 问题:***.com/questions/51874185/…

以上是关于如何使用系统参数构建“级联”CLI 工具?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 vue-cli 中设置生产构建路径?

如何在 Entity Framework Core cli 工具中使用来自 dotnet 6 最小 API 的配置

如何实现参数级联查询

1-1课程介绍

如何使用 Ember CLI 进行生产就绪构建?

如何使用 Azure Devops CLI 下载构建工件?