我想这个问题以前有人问过,虽然我不确定一个好的搜索词。
argparse - Build back command line(通过搜索 argparse 和 sys.argv 找到)
在我们深入探讨这个问题之前,让我们先明确一点。 args=parser.parse_args() 与 args=parser.parse_args(sys.argv[1:]) 相同。但我可以想象你想知道sys.argv[1:] 会产生一些任意args 的情况。也许是为了测试,也许是为了驱动别人的代码。
argparse 中没有任何代码可以做到这一点。但是对于有限的情况,您可以从定义的操作中获取信息,并创建一个合理的sys.argv。
In [432]: parser = argparse.ArgumentParser()
In [433]: parser.add_argument('--example', type=int, default=0)
Out[433]: _StoreAction(option_strings=['--example'], dest='example', nargs=None, const=None, default=0, type=<type 'int'>, choices=None, help=None, metavar=None)
定义的动作列表:
In [435]: parser._actions
Out[435]:
[_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None),
_StoreAction(option_strings=['--example'], dest='example', nargs=None, const=None, default=0, type=<type 'int'>, choices=None, help=None, metavar=None)]
选择一个感兴趣的,看看它的一些属性:
In [436]: a1=parser._actions[-1]
In [437]: a1.type
Out[437]: int
In [438]: a1.default
Out[438]: 0
现在生成args:
In [439]: args=parser.parse_args(['--example','1'])
In [440]: args
Out[440]: Namespace(example=1)
In [441]: args.example *= 2
使用新的args 和来自操作的信息创建列表的简单示例。显然,工作代码需要推断要使用哪个动作。对于最常见的类型,str() 就足够了。
In [442]: if args.example != a1.default:
.....: print(['--example',str(args.example)])
.....:
['--example', '2']
或者我可以使用metavar 属性和usage 格式化程序:
In [445]: a1.metavar=str(args.example)
In [446]: parser.print_usage()
usage: ipython2.7 [-h] [--example 2]