首页 > 解决方案 > argparse - 如何将特定 args 与特定函数相关联

问题描述

背景

我正在尝试编写一个包含多个函数的python脚本,如下所示:

 import sys
 def util1(x, y):
     assert(x is not None)
     assert(y is not None)
     #does something

 def util2(x, y):
     assert(x is not None)
     assert(y is not None)
     #does something

 def util3(x, y):
     assert(x is not None)
     assert(y is not None)
     #does something

我需要能够调用任何方法命令行:

 python3 myscript.py util1 arg1 arg2

或者

 python3 myscript.py util3 arg1 arg2

问题

我不知道获取命令行参数并将它们传递给方法的正确方法。我找到了一种获取第一个 arg 的方法……但如果可能的话,我想用一种方法说“将所有 arg 传递给函数 x”。

到目前为止我尝试过的

到目前为止,我在脚本的底部添加了以下逻辑:

 if __name__ == '__main__':
     globals()[sys.argv[1]]()

所以现在,当我尝试运行我的脚本时,我得到以下响应:

 lab-1:/var/www/localhost/htdocs/widgets# python3 myscript.py utils1 1 99999
 Traceback (most recent call last):
 File "myscript.py", line 62, in <module>
    globals()[sys.argv[1]]()
 TypeError: util1() missing 2 required positional arguments: 'x' and 'y'

我还尝试了以下方法:

     globals()[*sys.argv[1:]]()
     globals()[*sys.argv[1]:[2]]()

但这不起作用。我收到类似“TypeError: unhashable type: 'list'

如果您能指出我正确的方向,我将不胜感激。谢谢。

编辑 1

Based on the recommendation here to review a similar post, I changed my logic to include the argparse library.  So now I have the following: 

parser = argparse.ArgumentParser(description='This is the description of my program')
parser.add_argument('-lc','--lower_create', type=int, help='lower range value for util1')
parser.add_argument('-uc','--upper_create', type=int, help='upper range value for util1')
parser.add_argument('-lr','--lower_reserve', type=int, help='lower range value for util3')
parser.add_argument('-ur','--upper_reserve', type=int, help='upper range value for util3')

args = parser.parse_args()
#if __name__ == '__main__':
#    globals()[sys.argv[1]](sys.argv[2], sys.argv[3])

不清楚的是我如何将这些参数与特定函数“链接”。所以假设我需要 -lc 和 -uc 用于 util1。我怎样才能建立这种关联?然后例如将 -lr 和 -ur 与 util3 关联?谢谢

标签: python

解决方案


调用时需要将参数传递给函数。天真的方法是这样的:globals()[sys.argv[1]](sys.argv[2], sys.argv[3])尽管您可能需要做一些额外的检查以确保参数存在,以及被调用的函数。


推荐阅读