使用 argparse 调用函数

Calling a function using argparse

我试图在键入 -a 时通过 argparse 调用函数 addPXT。它没有那样做。阅读另一个问题,addPXT 不在冒号中,试过它说 addPXT 不可调用。

parser = argparse.ArgumentParser()
parser.add_argument('-a' ,action='store_const'  ,const='addPXT')
results = parser.parse_args()

def addPXT():
        print "hello"

    python script.py -a

您在 add_argument 中缺少一个 dest 选项以便能够引用该选项。

然后您需要测试 -a 选项是否作为参数传递。如果是,则调用该函数。

parser = argparse.ArgumentParser()
parser.add_argument('-a' ,dest="my_flag", action='store_const'  ,const=True)
results = parser.parse_args()

def addPXT():
    print "hello"

if results.my_flag:
    addPXT()

如果您是 argparsepython 的初学者,我建议您坚持使用默认的 store 操作,它存储字符串和布尔操作 ('store_true/false').确保你首先了解这些。

也就是说,这里有一种使用 store_const 调用不同函数的方法:

In [131]: import argparse

定义 2 个函数:

In [132]: def act1():
     ...:     print('act1')
     ...:    
In [133]: def act2():
     ...:     print('act2')
     ...:     
In [134]: parser=argparse.ArgumentParser()
In [135]: parser.add_argument('-a',action='store_const',default=act1,const=act2);

我定义了默认值和常量 - 并指定了函数,而不是它们的名称。理解差异很重要。

试试默认大小写:

In [136]: args=parser.parse_args([])
In [137]: print(args)
Namespace(a=<function act1 at 0xb07331dc>)
In [138]: args.a()
act1

尝试 -a 命令行案例:

In [139]: args=parser.parse_args(['-a'])
In [140]: print(args)
Namespace(a=<function act2 at 0xb078c1dc>)
In [141]: args.a()
act2

如果您有更多参数 (dest),您可以将 args 传递给您的函数,如果它被定义为接受它们,args.a(args).

更简单的布尔参数方法:

In [146]: parser=argparse.ArgumentParser()
In [147]: parser.add_argument('-a',action='store_true');
In [148]: args=parser.parse_args([])
In [149]: print(args)
Namespace(a=False)
In [150]: if args.a:
     ...:     act2()
     ...: else:
     ...:     act1()
act1
# similarly for `['-a']`.

或者如果您接受字符串,甚至可以选择

if args.a == 'act1':
     act1()
elif ...

argparse 的主要目的是推断用户想要什么,并发出帮助和错误消息。根据该信息采取行动主要是其余代码的责任。

argparse 将在解析期间调用 action 对象,但您需要提供类似于 Action class 的内容,因为解析器稍后将使用该对象。 Action doc

You may also specify an arbitrary action by passing an Action subclass or other object that implements the same interface. The recommended way to do this is to extend Action, overriding the call method and optionally the init method.

因此,创建一个 Action subclass 并让它调用您的函数

import argparse
import sys

def addPXT():
    print "hello"

class FooAction(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        addPXT()

parser = argparse.ArgumentParser()
parser.add_argument('-a', action=FooAction)
results = parser.parse_args(sys.argv[1:])