如何通过argparse为标志添加一个n长的参数列表?

时间:2014-09-30 20:02:10

标签: python argparse

到目前为止,我的代码中有def main(input_dir=None, output_dir=None):,后来我有了; {/ p>

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('input_dir')
    parser.add_argument('output_dir')
    main(**vars(parser.parse_args()))

这很好用,但我想添加一些标志。我不确定如何去做。 我已经尝试了parser.add_argument('-b', '--blacklist', nargs='*', type=str),但它没有解析。

我想要做的是能够运行./script.py input_dir output_dir./script.py input_dir output_dir -b do re mi fa so la si do./script.py input_dir output_dir --blacklist do re mi fa so la si do)并且“存储在一个集合中”我可以在["do,"re","mi","fa","so","la","si","do"]中访问的main()列表。

解决方案

添加parser.add_argument('-b', '--blacklist', nargs='+')并将def修改为def main(input_dir=None, output_dir=None, blacklist=None)

2 个答案:

答案 0 :(得分:1)

parser.add_argument('-b', '--blacklist', nargs='+', type=str)
...
args = parser.parse_args()
main(**vars(args))

根据文档vars()将NameSpace转换为dict

答案 1 :(得分:0)

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('input_dir')
parser.add_argument('output_dir')
parser.add_argument('-b', '--blacklist', nargs='*', type=str)  
args = parser.parse_args()
print args   # good debugging practice

def main(input_dir=None, output_dir=None, **kwargs):
    print input_dir, output_dir
    print kwargs

main(**vars(args))

产生

2146:~/mypy$ python2.7 stack26129093.py input output
Namespace(blacklist=None, input_dir='input', output_dir='output')
input output
{'blacklist': None}

2146:~/mypy$ python2.7 stack26129093.py input output -b do re me
Namespace(blacklist=['do', 're', 'me'], input_dir='input', output_dir='output')
input output
{'blacklist': ['do', 're', 'me']}

您可以为blacklist=None设置main参数,但**kwargs是传递许多可选参数的便捷方式。

使用nargs='+' v '*'并不重要。 '*'只允许prog input output -b,生成blacklist=[]

看起来这里的主要问题是定义一个带有各种关键字参数的函数。 argparse部分是直截了当的。 parse_args会为您提供一个Namespace对象,该对象很容易变成vars(args)的字典。直接访问Namespace值也很容易:

 args.input_dir
 args.output_dir # 'output'
 args.blacklist  # ['do', ...]

所以main也可以写成:

def main(args):
    print args.input_dir
    ...