如何使用系统参数构建“级联”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 工具?的主要内容,如果未能解决你的问题,请参考以下文章