如果我有argparser.ArgumentParser
,加上从parser.parse_args
返回的命名空间,是否有一种简单的方法可以将命名空间转换回argv列表,以便将它们传递回程序?基本上,是否存在parse_args的反函数?
示例场景:
parser = argparse.ArgumentParser()
parser.add_argument('--example', type=int, default=0)
args = parser.parse_args(argv)
args.example *= 2
new_argv = parser.generate_argv(args)
所以,如果我打电话:
python my_program.py --example 1
我想回来:
new_argv = ['--example', '2']
答案 0 :(得分:3)
我认为之前已经提到过,但我不确定搜索字词是否合适。
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
创建列表和Action中的信息的简单示例。显然,工作代码需要推断出要使用的操作。对于最常见的类型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]
答案 1 :(得分:0)
从parser.parse_args(args)中删除args
args [1] == example
args [2] ==字符串编号
args.example == int number
from sys import argv
parser = argparse.ArgumentParser()
parser.add_argument('--example', type=int, default=0 )
args = parser.parse_args()
print ([argv[1],args.example*2])
然后
python my_program.py --example 1
>>>['--example', 2]
答案 2 :(得分:0)
我最终遇到了这种情况,这是我的解决方案。它假设您知道预期的位置参数。绝对不是万无一失,但它对我有用。
def simulate_args_from_namespace(n, positional=[]):
""" check an argparse namespace against a module's get_args method.
Ideally, there would be something built in to argparse, but no such luck.
This tries to reconstruct the arg list that argparse.parse_args would expect
"""
arg_list = [[k, v] for k, v in sorted(vars(n).items())]
argparse_formatted_list = []
for l in arg_list:
#### deal with flag arguments (store true/false)
if l[1] == True:
argparse_formatted_list.append("--{}".format(l[0]))
elif l[1] == False or l[1] is None:
pass # dont add this arg
# add positional argments
elif l[0] in positional:
argparse_formatted_list.append(str(l[0]))
# add the named arguments
else:
argparse_formatted_list.append("--{}".format(l[0]))
argparse_formatted_list.append(str(l[1]))
return argparse_formatted_list