到目前为止,我的代码中有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)
答案 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
...