Python 使用argparse调用函数

Python 使用argparse调用函数,python,python-2.7,argparse,Python,Python 2.7,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" 在add_参数中缺少

当类型为-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"


在add_参数中缺少能够引用该选项的
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()

如果您是
argparse
python
的初学者,我建议您坚持使用默认的
store
操作(存储字符串)和布尔操作(“store\u true/false”)。确保你首先理解这些

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

In [131]: import argparse
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 [131]: import argparse
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
如果有更多参数(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
类的内容,因为解析器稍后将使用该对象。警察说

还可以通过传递action子类来指定任意操作 或实现相同接口的其他对象。推荐的 实现这一点的方法是扩展操作,覆盖调用方法和 可选地使用init方法

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

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:])

你为什么认为它会这样做?我正在尝试调用一个函数,阅读另一期。这是推荐的。你能链接到这一点,并提供一个实际的答案吗?冒号是指引号吗?add_argument()的const参数用于保存常量值——您确定这应该是函数名吗?您的目标是什么
argparse
用于解析命令行参数,而不是调用任意函数。如果
addPTX
应该处理一个参数,供您的程序以后使用,那就太好了。但是请阅读关键字是如何工作的。它有一个特定的角色,它使用一个对象。这是否是正确的答案取决于OP的意图。如果OP想为命令解析器定义一个替代动作,则使用
动作
对象更合适。对,但据我所知,
动作
关键字不支持py3中的函数调用,请使用'action='store\u true'获得简单的真/假标志。对于Python/argparse初学者来说,简单的True/False和string参数是最好的。如果没有
dest
results.a
获取值。或者使用
('-a','-my_flag',…)
action
关键字需要一个类似
action
的对象,它应该在解析器继续运行之前对该选项进行一些预处理。根据OP想要做什么,您的答案或使用
操作的某个对象是最好的。我尝试使用类型也不适用。请确保您理解何时执行
type
函数。请参阅我对link.parser.add_参数('-a',action='store_const',default='addPXT',const='test')的接受答案的评论;我尝试使用ur方法,但无法将default和const作为函数名,只能将其作为字符串接受。当我尝试results.a()时,它说str不可调用。另一方面,如果我删除冒号,我会得到addPXT未定义
它只接受一个字符串
-detaily。错误信息是什么?您需要理解函数名(引用)和字符串之间的区别。字符串不可调用。代码末尾显示了如何使用字符串值。回溯(最近一次调用last):parser.add_参数('-a',action='store_const',default='addPXT',const=test)中第17行的文件“PXT.py”;NameError:未定义名称“test”