如何在Python中使Shell脚本样式的参数与argparse一起传递



我有一个python解析参数,如下所示:

代码:

if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Args test')
parser.add_argument('-myarg1', '--myarg1', type=str, dest='myarg1', required=True, help='Help yourself')
parser.add_argument('-myarg2', '--myarg2', type=str, dest='myarg2', default=' ', help='Help yourself')
args = parser.parse_args()
print(args.myarg1)
print(args.myarg2)

上面的工作,如果我调用脚本如下:

python myargs.py -myarg1 something -myarg2 somethingelse

但如果我这样称呼它,它就不起作用:

python myargs.py -myarg1 something -myarg2

并抛出以下错误,显然是因为它希望调用者为第二个参数传递值。

usage: myargs.py [-h] -myarg1 MYARG1 [-myarg2 MYARG2]
myargs.py: error: argument -myarg2/--myarg2: expected one argument

问题:
我理解python在上面抱怨它的原因。但是,我希望我的python脚本的用户能够调用第二个参数,只说-myarg2--myarg2,而不指定类型。就像shell脚本样式一样。用argparse可以做到吗?

我使用的是python 2.7及以上版本。

这是可能的。可以使用action="store_true"属性将参数转换为布尔值(标志(。

parser.add_argument('-myarg2', '--myarg2', dest='myarg2', action="store_true", help='Help yourself')
args = parser.parse_args()
print(args.myarg2) # True if "python myargs.py -myarg2", False if "python myargs.py"

编辑

如果希望用户能够将可选参数传递给myarg2标志,则需要使用nargs='?'属性。您还需要定义一个default属性,如果不使用该标志,将调用该属性;以及一个const属性,如果使用该标志但没有参数,将调用它。

parser.add_argument('-myarg2', '--myarg2', dest='myarg2', nargs='?', const="no value", default='no flag', help='Help yourself')

问题是调用参数标志时没有值。如果您希望该值为空字符串,请执行-

python myargs.py -myarg1 something -myarg2 ' '

如果您想使用--myarg并将其解释为true(否则为false(,则需要使用

parser.add_argument("-myarg2", "--myarg2", action="store_true")

最新更新