使用 argparse 选项调用函数并向其传递 sys.argv 元素

call a function with argeparse option and pass it a sys.argv element

我有两个功能

p={}
def a(arg2):
  #do something 

def b(arg2):
  #do something with arg 2

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='*******')
    parser.add_argument('-a',dest=a(p),action='store')
    parser.add_argument('-s',dest=b(sys.argv[3]), action='store')

    args = parser.parse_args
 

但是当我 运行 script.py -s JohnDoe 它没有 运行 参数 JohnDoe 的函数 b 有什么问题?

args = parser.parse_args

缺少运行该方法的 ()。否则,您最终会将绑定方法分配给 args。它不解析任何东西。

dest 参数应该是一个字符串。它是 args 中属性的名称。没有 destscript.py -s JohnDoe 应该产生

In [858]: setattr(args, 's', 'JohnDoe')    # done during parsing
In [859]: args                          # display the args variable
Out[859]: Namespace(s='JohnDoe')
In [860]: args.s
Out[860]: 'JohnDoe'

您可以在

中使用
b(arg.s)

action 参数决定了如何处理新解析的值。正如我所演示的,默认是将它存储在 args 中。使用自定义 Action class 可以做更高级的东西,但这是一个高级主题。

dest=b(sys.argv[3])

dest 设置为任何值 b returns,可能是 None。如果 b 被定义为

def b(arg):
    return arg

然后 b(sys.argv[3]) 会产生 JohnDoe,你会得到一个 args 看起来像:

In [863]: args
Out[863]: Namespace(JohnDoe='JohnDoe')

这是一个可爱的把戏,但可能不是您想要的。