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

如何在Python中使用argparse传递Shell脚本样式的参数,python,python-2.7,argparse,Python,Python 2.7,Argparse,我有一个python解析参数,如下所示: python myargs.py -myarg1 something -myarg2 somethingelse python myargs.py -myarg1 something -myarg2 代码: if __name__ == "__main__": parser = argparse.ArgumentParser(description='Args test') parser.add_argument(

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

python myargs.py -myarg1 something -myarg2 somethingelse
python myargs.py -myarg1 something -myarg2
代码:

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
但如果我这样称呼它,它就不起作用了:

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及更高版本。

问题在于调用参数标志时没有值。如果希望值为空字符串,请执行以下操作-


python myargs.py-myarg1 something-myarg2'

问题在于调用参数标志时没有值。如果希望值为空字符串,请执行以下操作-


python myargs.py-myarg1某物-myarg2''
这是可能的。您可以使用
action=“store\u true”
属性将参数转换为布尔值(标志)

parser.add_参数('-myarg2','-myarg2',dest='myarg2',action=“store_true”,help='help yourself')
args=parser.parse_args()
打印(args.myarg2)#如果是“python myargs.py-myarg2”,则为True;如果是“python myargs.py”,则为False
编辑 如果希望用户能够将可选参数传递给
myarg2
标志,则需要使用
nargs='?'
属性。您还需要定义一个
default
属性,如果不使用该标志,将调用该属性;如果使用该标志但没有参数,将调用一个
const
属性

parser.add_参数('-myarg2','-myarg2',dest='myarg2',nargs='?',const='no value',default='no flag',help='help')

这是可能的。您可以使用
action=“store\u true”
属性将参数转换为布尔值(标志)

parser.add_参数('-myarg2','-myarg2',dest='myarg2',action=“store_true”,help='help yourself')
args=parser.parse_args()
打印(args.myarg2)#如果是“python myargs.py-myarg2”,则为True;如果是“python myargs.py”,则为False
编辑 如果希望用户能够将可选参数传递给
myarg2
标志,则需要使用
nargs='?'
属性。您还需要定义一个
default
属性,如果不使用该标志,将调用该属性;如果使用该标志但没有参数,将调用一个
const
属性

parser.add_参数('-myarg2','-myarg2',dest='myarg2',nargs='?',const='no value',default='no flag',help='help')
如果要使用--myarg并将其解释为true(否则为false),则需要使用

parser.add_argument("-myarg2", "--myarg2", action="store_true")
如果要使用--myarg并将其解释为true(否则为false),则需要使用

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


myarg2的预期值类型是什么?我更新了值类型。两个参数都是字符串类型myarg2的预期值类型是什么?我更新了值类型。它的str。两个参数都是字符串类型。我知道我可以传递“”或“”。它可以工作,但我想避免它我知道我可以通过“”或“”。它是有效的,但我想避免它,但如果她想传递
str
参数,这将导致error@Lior科恩说得对。奇怪的是,python没有给出传递字符串或不传递字符串的方法。但是,如果这是python中的约束,那么我将不得不接受它。只有一个问题。action='store\u false'将其设置为false?如何检查用户是否已传递输入?@AdeleGoldberg的确,
action=“store\u false”
将其设置为false,而
action=“store\u const”
将其设置为
常量属性的值。您可以了解更多信息,但如果她想传递
str
参数,则会引发error@Lior科恩说得对。奇怪的是,python没有给出传递字符串或不传递字符串的方法。但是,如果这是python中的约束,那么我将不得不接受它。只有一个问题。action='store\u false'将其设置为false?如何检查用户是否已传递输入?@AdeleGoldberg的确,
action=“store\u false”
将其设置为false,而
action=“store\u const”
将其设置为
常量属性的值。你可以了解更多,但如果她想通过str参数,这将导致引发错误确实,我修改了我的答案以处理此案例,但如果她想通过str参数,这将导致引发错误确实,我修改了我的答案以处理此案例