python argparser:如何将特定参数与特定函数关联
我刚刚接触python和argparser库。我试图弄清楚如何编写一个脚本文件,它有许多不同的函数,每个函数需要不同的参数 例如,我可能有以下方法签名:python argparser:如何将特定参数与特定函数关联,python,Python,我刚刚接触python和argparser库。我试图弄清楚如何编写一个脚本文件,它有许多不同的函数,每个函数需要不同的参数 例如,我可能有以下方法签名: def function1(a,b,c): def function2(x,y,z): def function3(): 到目前为止我所拥有的 到目前为止,我已经添加了所有可能的参数作为可选项,如下所示: import argparse def function1(lc,uc): assert(lc is not None
def function1(a,b,c):
def function2(x,y,z):
def function3():
到目前为止我所拥有的
到目前为止,我已经添加了所有可能的参数作为可选项,如下所示:
import argparse
def function1(lc,uc):
assert(lc is not None)
assert(uc is not None)
#do something
def function2():
#do something else
def function3(lr,ur):
assert(lr is not None)
assert(ur is not None)
#do something else
parser = argparse.ArgumentParser(description='This is the description of my program')
parser.add_argument('-lc','--lower_create', type=int, help='lower range value for creating mailboxes')
parser.add_argument('-uc','--upper_create', type=int, help='upper range value for creating mailboxes')
parser.add_argument('-lr','--lower_reserve', type=int, help='lower range value for reserving mailboxes')
parser.add_argument('-ur','--upper_reserve', type=int, help='upper range value for reserving mailboxes')
args = parser.parse_args()
parser = argparse.ArgumentParser(description='This is the description of my program')
parser.add_argument('func_name',help='name of function you want to run')
parser.add_argument('-lc','--lower_create', type=int, dest='lc', help='lower range value for creating mailboxes')
parser.add_argument('-uc','--upper_create', type=int, dest='uc', help='upper range value for creating mailboxes')
parser.add_argument('-lr','--lower_reserve', type=int, dest='lr', help='lower range value for reserving mailboxes')
parser.add_argument('-ur','--upper_reserve', type=int, dest='ur', help='upper range value for reserving mailboxes')
args = parser.parse_args()
到目前为止还不错。当我这样运行脚本时:
python3 myutils.py
我没有任何错误
当我这样做时:
python3 myutils.py -h
它给了我一个很好的帮助系统
但我不清楚的是如何将特定参数与特定函数关联起来。这是调用function1时出现的错误,例如:
lab-1:/var/www/localhost/htdocs/pvmaildbapp# python3 myutils.py function1
usage: myutils.py [-h] [-lc LOWER_CREATE] [-uc UPPER_CREATE]
[-lr LOWER_RESERVE] [-ur UPPER_RESERVE]
myutils.py: error: unrecognized arguments: function1
我还是第一次通过argparse文档,所以我肯定我错过了一些东西。但任何正确方向的提示/指示都将不胜感激
编辑1
基于d_kennetz和UtahJarhead的以下回答,谢谢你,顺便说一句,我已经更改了代码,为每个参数包含一个dest parm,并且我还需要一个arg用于用户试图调用的函数,如下所示:
import argparse
def function1(lc,uc):
assert(lc is not None)
assert(uc is not None)
#do something
def function2():
#do something else
def function3(lr,ur):
assert(lr is not None)
assert(ur is not None)
#do something else
parser = argparse.ArgumentParser(description='This is the description of my program')
parser.add_argument('-lc','--lower_create', type=int, help='lower range value for creating mailboxes')
parser.add_argument('-uc','--upper_create', type=int, help='upper range value for creating mailboxes')
parser.add_argument('-lr','--lower_reserve', type=int, help='lower range value for reserving mailboxes')
parser.add_argument('-ur','--upper_reserve', type=int, help='upper range value for reserving mailboxes')
args = parser.parse_args()
parser = argparse.ArgumentParser(description='This is the description of my program')
parser.add_argument('func_name',help='name of function you want to run')
parser.add_argument('-lc','--lower_create', type=int, dest='lc', help='lower range value for creating mailboxes')
parser.add_argument('-uc','--upper_create', type=int, dest='uc', help='upper range value for creating mailboxes')
parser.add_argument('-lr','--lower_reserve', type=int, dest='lr', help='lower range value for reserving mailboxes')
parser.add_argument('-ur','--upper_reserve', type=int, dest='ur', help='upper range value for reserving mailboxes')
args = parser.parse_args()
然后,我还更改了function1的定义,如下所示:
def function1(lc,uc):
assert(lc is not None)
assert(uc is not None)
print('made it here')
return True
python3 myutils.py function1 -lc 1 -uc 3
最后,我现在尝试通过命令行如下调用:
def function1(lc,uc):
assert(lc is not None)
assert(uc is not None)
print('made it here')
return True
python3 myutils.py function1 -lc 1 -uc 3
但它根本不调用function1。
我显然又少了一块拼图
我认为在我调用parse_args之后,我在代码末尾需要的是这样的东西:伪代码
select case args.func_name
case 'function1'
make sure i have lc and uc
case function3
make sure i have lr and ur
end select
这是正确的吗
编辑2
好的,我想我已经把所有的点连接起来了
我肯定错过了保存函数的位置参数
用户要调用的名称。
我仍然在使用可选参数
保存lc、uc等值的符号。
我缺少的是手动将函数与args匹配的逻辑。出于某种原因,我想我可以通过argparse库免费获得一些管道。
现在我有了如下代码:
args = parser.parse_args()
#print(args)
if args.func_name == 'function1':
#make sure we have lc and uc
assert(args.lc is not None)
assert(args.uc is not None)
function1(args.lc, args.uc)
elif args.func_name == 'function3':
assert(args.lr is not None)
assert(args.ur is not None)
function3(args.lr, args.ur)
elif args.func_name == 'function2':
function2()
代码是有效的。但我觉得可能有一种更优雅的方式来处理我拥有的最后一系列if/elif。。。随着这个实用程序文件的增长,我向其中添加了更多的方法,if-elif列表将变得非常大。您试图使用所需的位置参数,但在argparse设置中没有设置位置参数。要解决此问题,听起来您需要添加以下额外行:
parser.add_argument('func_name', help='function name')
实际上,您已经创建了4个变量:args.lower\u create、args.upper\u create、args.lower\u reserve、args.upper\u reserve。如果您传入了类似python3 myutils.py-lc 1234的内容,那么args.lower\u create的值将为1234
编辑:我想你可能没有包括适当的输入。它期待着类似于:
python3 myutils.py -lc 0 -uc 1 -lr 2 -ur 3
为了解释哪里出了点问题,需要将目标传递给argparse参数,以便在代码中将其作为变量调用。其次,函数调用中使用的变量,如def function1lc,uc:将是该函数的局部变量,因此它们不会被解释为全局变量。这是一件好事,因为我们通常不希望将全局变量传递给函数调用,尽管存在一些例外 以下是我对您的代码的修改:
import argparse
import sys
parser = argparse.ArgumentParser(description='This is the description of my program')
parser.add_argument('-lc','--lower_create', type=int, dest="lc", help='lower range value for creating mailboxes')
parser.add_argument('-uc','--upper_create', type=int, dest="uc", help='upper range value for creating mailboxes')
parser.add_argument('-lr','--lower_reserve', type=int, dest="lr", help='lower range value for reserving mailboxes')
parser.add_argument('-ur','--upper_reserve', type=int, dest="ur", help='upper range value for reserving mailboxes')
args = parser.parse_args()
def function1(lc,uc):
assert(lc is not None)
assert(uc is not None)
return True
print(function1(args.lc, args.uc))
首先,您会看到我在parser.add_参数调用中传递了一个名为dest=的选项。这将告诉python代码该参数将在程序中被调用
然后,我编写了一个函数,如果将值传递给该函数,则返回True
最后,我对print的调用通过以下语法args.lc、args.uc调用我的argparse dest=变量。这就是在python代码中调用argparse参数的方式
最后,当我运行命令并传递值时:
$ python3.5 argfun.py -lc 4 -uc 0
产出:
4
最后一行args。。。只收集输入的参数。您现在必须编写代码来检查它们并启动所需的函数。添加最后一行print args,然后您将看到args并了解如何编写if子句来启动函数。@576i ah ok。例如,我可以向function1添加逻辑,该逻辑查看args变量内部并获取它所需的内容?您可以检查args.lc是否为none,然后启动函数1,检查args.lr是否为none,然后启动函数3。。。。谷歌argparse教程了解更多信息,我强烈建议花一个小时了解更多信息。如果使用arghandler,您可以轻松地指定具有不同位置和可选参数的子命令。值得一看。谢谢你的解释。但有一个相关的问题。我需要使用的命令行示例实际上是python3myscript.py function1-lc4-uc10。我不希望脚本本身调用任何函数。用户将触发他们需要的任何功能。我将测试你的代码,但感觉你的答案并没有解决这个问题?请参阅我更新的文章编辑1部分。谢谢。我刚刚看过你的代码,我认为你的if/elif/else循环实际上是一个很好的cond方法
除了编写一个超出SO范围的程序之外,还需要传统地调用函数。实际上,我的一些程序中有条件函数调用。在我的头顶上,我有一个运行infle.endswith.txt:pd.read_tableinfle;elif infie.endswith.csv:pd.read_csvinfile这是很常见的。所以我不能接受你们的两个答案,但你们都对最后的东西做出了贡献。所以我想我会投票给你们中的一个,并接受另一个作为答案。谢谢你,我想你是对的。我需要添加一个位置参数作为第一个参数…这样它就知道我需要一个函数名。但是我仍然不明白如何将参数传递给正确的函数。请参见编辑1我用两个答案解决了我的问题。所以我接受了第一个答案,并对你的答案投了更高的票。感谢将来的知识,您传递的所有信息都保存在args中。这是在args=parser.parse_args的地方完成的。您可以打印参数以查看其中的内容。在该名称空间中,您可以使用args.lower\u create、args.upper\u create、args.lower\u reserve和args.upper\u reserve引用它们,如上所述。感谢您的患者帮助!没问题。祝你好运