我想允许任意命令行参数。如果用户向我提供了如下所示的命令行
myscript.py --a valueofa --b valueofb posarg1 posarg2
我知道a
传递了valueofa
,b
传递了valueofb
并且我有最后两个位置参数。
我一直使用optparse,你可以准确指定要查找的参数。但我希望用户能够从命令行定义任意“宏”。当然有一个python模块比我写的任何东西都更优雅。是什么?
答案 0 :(得分:2)
可悲的是,你can't。如果你必须支持这个,你需要编写自己的选项parser =(。
答案 1 :(得分:0)
请argparse做你想做的事吗?它最近被添加到标准库中。具体来说,您可能需要查看文档的this section。
答案 2 :(得分:0)
arbitrary_args.py
:
#!/usr/bin/env python3
import sys
def parse_args_any(args):
pos = []
named = {}
key = None
for arg in args:
if key:
if arg.startswith('--'):
named[key] = True
key = arg[2:]
else:
named[key] = arg
key = None
elif arg.startswith('--'):
key = arg[2:]
else:
pos.append(arg)
if key:
named[key] = True
return (pos, named)
def main(argv):
print(parse_args_any(argv))
if __name__ == '__main__':
sys.exit(main(sys.argv[1:]))
$./arbitrary_args.py cmd posarg1 posarg2 --foo --bar baz posarg3 --quux
:
(['cmd','posarg1','posarg2','posarg3'],{'foo':True,'bar':'baz','quux':True})
argparse_arbitrary.py
:
#!/usr/bin/env python3
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-D', action='append', )
D = {L[0]:L[1] for L in [s.split('=') for s in parser.parse_args().D]}
print(D)
$./argparse_arbitrary.py -Ddrink=coffee -Dsnack=peanut
{'snack':'花生','喝':'咖啡'}