Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python argparser:如何将特定参数与特定函数关联_Python - Fatal编程技术网

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

我刚刚接触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)
     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引用它们,如上所述。感谢您的患者帮助!没问题。祝你好运