python中的任意命令行参数

时间:2010-07-28 19:23:58

标签: python command-line-arguments

我想允许任意命令行参数。如果用户向我提供了如下所示的命令行

myscript.py --a valueofa --b valueofb posarg1 posarg2

我知道a传递了valueofab传递了valueofb并且我有最后两个位置参数。

我一直使用optparse,你可以准确指定要查找的参数。但我希望用户能够从命令行定义任意“宏”。当然有一个python模块比我写的任何东西都更优雅。是什么?

3 个答案:

答案 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':'花生','喝':'咖啡'}