python Argparse模块的使用

python Argparse模块的使用

标签:python

参考:

Argparse Tutorial:https://docs.python.org/2.7/howto/argparse.html#id1

argparse - Parser for command-line options, arguments and sub-commands:https://docs.python.org/2.7/library/argparse.html?highlight=argparse#module-argparse

#################################################

模块argparse是Python标准库中推荐的命令行解析模块

有两个其他模块也能完成相同的功能,即getopt和optparse模块。其中,argparse是基于optparse模块实现的,因此在用法上也非常相似。

##################################################

基础

最简单的一个例子,编写prog.py:

[python]view plaincopy

importargparse

parser = argparse.ArgumentParser()

parser.parse_args()

运行上述脚本并且没有添加任何参数时,输出无结果

添加--help参数时,argparse模块会自动输出帮助信息,这是它的优势(参数--help也可以简化为-h,这两个参数是不需要我们编辑的)

当指定其他参数时报错,即便如此,也可以得到一个有用的用法信息

###############################################################

位置参数

指定位置参数后,程序必须输入该参数值才能运行

修改prog.py脚本:

[python]view plaincopy

importargparse

parser = argparse.ArgumentParser()

parser.add_argument("echo")

args = parser.parse_args()

printargs.echo

增加add_argument()方法,在这个方法中,我们指定程序将要去接受的命令行选项,在这里我们命名为echo(只是一个名字,可以随意更改)

此时,调用程序需要输入一个参数

方法parse_args()实际上会返回一些选项指定的值,上述例子中,选项为echo

在argparse模块中,当你指定位置参数名为echo时,此时想要提取该参数值,必须指定为args.echo

可以在add_argument()方法中添加help选项以便该位置参数更加明了

[python]view plaincopy

importargparse

parser = argparse.ArgumentParser()

parser.add_argument("echo", help="echo the string you use here")

args = parser.parse_args()

printargs.echo

一般我们要求输出位置参数是为了以后程序的运算。由于argparse将输入的参数均视为strings类型,而有时我们需要的是int类型,比如

[python]view plaincopy

importargparse

parser = argparse.ArgumentParser()

parser.add_argument("square", help="display a square of a given number")

args = parser.parse_args()

printargs.square**2

当我们需要输入一个int类型值时,由于默认输入参数值均为str类型,所以出错。此时有两种方法

第一种,在计算过程中转换str为int类型:

[python]view plaincopy

printint(args.square)**2

第二种,可以在add_argument()方法中用关键字type指定输入类型,即可解决:

[python]view plaincopy

parser.add_argument("square", help="display a square of a given number", help=int)

推荐使用第二种

######################################################################33

可选参数

一个简单的例子

[python]view plaincopy

importargparse

parser = argparse.ArgumentParser()

parser.add_argument("--verbosity", help="increase output verbosity")

args = parser.parse_args()

ifargs.verbosity:

print"verbosity turned on"

设置可选参数后,程序可以不输入该参数值运行

如果程序运行时要赋值可选参数,必须先指定该可选参数。例如

[python]view plaincopy

python prog.py --verbosity hel

如果程序运行时没有赋值给可选参数verbosity,则相应的args.verbosity也会为空(None)

如果程序使用了可选参数,后面必须跟参数值,不然会报错

默认可选参数会被赋值为str,而在实际情况中,很多时候,可选参数是作为一个标识而不是一个确切的值,仅需要确定是true或false即可,可以指定关键字action,赋值为"store_true"

[python]view plaincopy

importargparse

parser = argparse.ArgumentParser()

parser.add_argument("--verbosity", help="increase output verbosity", action="store_true")

args = parser.parse_args()

ifargs.verbosity:

print"verbosity turned on"

这样--verbosity就可以像--help类似,只需输入参数即可

############################################################################3

快捷选项(短选项)

类似命令行用法,长选项总会有相应的短选项,只需在相应的add_argument()方法中加上即可:

[python]view plaincopy

importargparse

parser = argparse.ArgumentParser()

parser.add_argument("-v","--verbose", help="increase verbosity", action="store_true")

args = parser.parse_args()

ifargs.verbose:

print"verbosity turned on"

####################################################################

结合使用位置参数(positional arguments)和可选参数(optional arguments)

[python]view plaincopy

importargparse

parser = argparse.ArgumentParser()

parser.add_argument("square", type=int, help="display a square of a given number")

parser.add_argument("-v","--verbose", action="store_true", help="increase output verbosity")

args = parser.parse_args()

answer = args.square**2

ifargs.verbose:

print"the square of {} equals {}".format(args.square, answer)

else:

printanswer

注意,参数顺序没有关系

[python]view plaincopy

importargparse

parser = argparse.ArgumentParser()

parser.add_argument("square", type=int, help="display a square of a given number")

parser.add_argument("-v","--verbosity", type=int, help="increase output verbosity")

args = parser.parse_args()

answer = args.square**2

ifargs.verbosity ==2:

print"the square of {} equals {}".format(args.square, answer)

elifargs.verbosity ==1:

print"{}^2 == {}".format(args.square, answer)

else:

printanswer

上述程序中还可改进以下,可以指定可选参数的取值范围,用关键字choices

[python]view plaincopy

parser.add_argument("-v","--verbosity", type=int, choices=[0,1,2], help="increase output verbosity")

此处还有另一种方法来执行程序,这也很普遍,并且这种方式匹配CPython可执行程序

[python]view plaincopy

parser.add_argument("-v","--verbosity", action="count", help="increase output verbosity")

还可以指定关键字default来指定选项默认的值

[python]view plaincopy

parser.add_argument("-v","--verbosity", default=2, action="count", help="increase output verbosity")

############################################################################

进阶用法

可以使用多个位置参数:

[python]view plaincopy

importargparse

parser = argparse.ArgumentParser()

parser.add_argument("x", type=int, help="the base")

parser.add_argument("y", type=int, help="the exponent")

parser.add_argument("-v","--verbosity", action="count", default=0)

args = parser.parse_args()

answer = args.x**args.y

ifargs.verbosity >=2:

print"{} to the power {} equals {}".format(args.x, args.y, answer)

elifargs.verbosity >=1:

print"{}^{} == {}".format(args.x, args.y, answer)

else:

printanswer

可以使用可选参数来显示不同级别的信息:

[python]view plaincopy

parser = argparse.ArgumentParser()

parser.add_argument("x", type=int, help="the base")

parser.add_argument("y", type=int, help="the exponent")

parser.add_argument("-v","--verbosity", action="count", default=0)

args = parser.parse_args()

answer = args.x**args.y

ifargs.verbosity >=2:

print"Running '{}'".format(__file__)

ifargs.verbosity >=1:

print"{}^{} == ".format(args.x, args.y)

printanswer

##################################################

以下是DIGITS中的一段源码:

[python]view plaincopy

if__name__ =='__main__':

script_start_time = time.time()

parser = argparse.ArgumentParser(description='Classification example - DIGITS')

### Positional arguments

parser.add_argument('caffemodel',   help='Path to a .caffemodel')

parser.add_argument('deploy_file',  help='Path to the deploy file')

parser.add_argument('image',        help='Path to an image')

### Optional arguments

parser.add_argument('-m','--mean',

help='Path to a mean file (*.npy)')

parser.add_argument('-l','--labels',

help='Path to a labels file')

parser.add_argument('--nogpu',

action='store_true',

help="Don't use the GPU")

args = vars(parser.parse_args())

image_files = [args['image']]

classify(args['caffemodel'], args['deploy_file'], image_files,

args['mean'], args['labels'],notargs['nogpu'])

print'Script took %s seconds.'% (time.time() - script_start_time,)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,630评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,405评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,382评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,548评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,853评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,276评论 1 209
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,638评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,350评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,015评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,309评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,836评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,206评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,767评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,972评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,715评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,319评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,222评论 2 258

推荐阅读更多精彩内容