Python argparse检查是否存在标志,同时允许参数

时间:2017-07-17 09:35:56

标签: python argparse

如何检查标志--load是否存在?

#!/usr/bin/env python3
import argparse
import os 

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('-l', '--load', nargs='?', metavar='path', help='Load all JSON files recursively in path')

args = parser.parse_args()

print(args)

使用--load调用脚本输出以下内容: Namespace(load=None)

我不能省略nargs='?'并使用action='store_true',因为我想允许传递参数,例如--load abcxyz

添加action='store_true'nargs='?'会产生错误:

    parser.add_argument('-l', '--load', nargs='?', metavar='path', help='Load all JSON files recursively in path', action='store_true')
  File "/usr/lib/python3.6/argparse.py", line 1334, in add_argument
    action = action_class(**kwargs)
TypeError: __init__() got an unexpected keyword argument 'nargs'

2 个答案:

答案 0 :(得分:1)

在上面的代码片段中,用于检查--load标志:

#!/usr/bin/env python3
import argparse
import os
name = None
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('-l', '--load', metavar='path', help='Load all JSON 
files recursively in path')

args = parser.parse_args()

print(args.load)

if args.load:
    name = args.load

会将name分配给abcxyz,否则将为无。 如果我能够理解您的问题,上面的代码实际上可以满足您的需求。 实际上并不需要name变量,仅用作示例。

答案 1 :(得分:0)

您可以使用in运算符来测试是否为(子)命令定义了一个选项。然后,您可以将已定义选项的值与其默认值进行比较,以检查是否在命令行中指定了该选项。

#!/usr/bin/env python3
import argparse
import os 

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('-l', '--load', 
    dest='load', nargs='?', default=None, 
    help='Load all JSON files recursively in path')

args = parser.parse_args()

'some_non_exist_option' in args # False
'load' in args # True
if args.load is not None:   
    ...