Python - OptParse 分析命令行输入模块

要自己定制程序的参数选项控制, 可以使用 Python 自带的 OptParse 模块。

import optparse

也可以直接解析 sys.argv 里的参数,但是过于麻烦。

OptParse 支持一般性 GNU 的选项方法,包括:

  • 无参选项, -v
  • 有参选项, -p value, –para=value
  • 值参一体, -pvalue (不支持长参数)
  • 合并选项, -abc, -abcp value (最后一个可以是有参, 其余均无参)

解析时,--- 的区别:

  • - 就看后面的值, 要是无参的, 那继续读下一个; 要是有参的,就把参数读进来(分隔或一体).
  • -- 直接读后面的值;

optparse 现在不再更新了,更新版本叫 argparse.

optparse module

基本用法:

  1. 载入OptionParser类,新建对象: OptionParser()
  2. 添加选项: add_option(…)
  3. 参数解析: parse_args()
from optparse import OptionParser

# 一个帮助文档解释字符串
hstr = '%prog custom help string'
parser = OptionParser(hstr, description='custom description', version='%prog 1.0')
parser.add_option('-i', '--input', action='store', dest='input', help='read input data from input file')
parser.add_option('-o', '--output', action='store', dest='output', help='write data to output file')
parser.add_option('-q', '--quite', action='store_false', dest='version', help='don\'t print the version')
# parser.add_option('-v', '--version', action='store_true', dest='version', default=False, help='print the version')
# parser.add_option('-v', '--version', action='store_true', dest='version', help='print the version')

parser.add_option('-f', '--file', action='store', dest='file', help='file to handle')
parser.add_option('-a', '--add', action='append', dest='add', help='add to handle')
parser.add_option('-c', '--count', action='count', dest='count', help='count to handle')
parser.add_option('-d', '--count1', action='count', dest='count', help='count1 to handle')

#parser.add_option('-v', '--version', dest='version')

# if parser.has_option('-f'):
#     print('content -f')
#     parser.set_default('-f', 'myFile')
#     parser.remove_option('-f')
#
# if not parser.has_option('-f'):
#     print('do not content -f')


# 用一个数组模拟命令参数
#testArgs = ['-i', 'someForInput', '-f', 'someForFile', '-vq', '-a', 'test1 test2 test3', '-c', '-d']
testArgs = [ '-i', 'someForInput', 'someForFile', 'someForFile1', '-q', '-a', 'test1 test2 test3', '-c', '-d', '-h']
options, args = parser.parse_args(testArgs)

print('options : %s' % options)
print('args : %s' % args)

if options.input:
    print('input in args : %s' % options.input)

if options.version:
    print('version 1.0.0')

# if options.file:
#     print('file in args : %s' % options.file)

if options.add:
    print('add in args : %s' % options.add)

print('version in args', options.version)

新建对象

parser=OptionParser()

形参包括:

    def __init__(self,
                 usage=None,
                 option_list=None,
                 option_class=Option,
                 version=None,
                 conflict_handler="error",
                 description=None,
                 formatter=None,
                 add_help_option=True,
                 prog=None,
                 epilog=None):

新建选项

可以使用:add_option, add_option_group, add_options.

add_option(…):
add_option 方法中前面的参数为命令的选项, 可以为等价的短名或者长名,一般是前面为短名,后面为长名.

可以配置的参数有以下:

  • dest: 可以决定解析后,取值时的属性名, 尤其适于有多个等价参数. 不指定时就是选项不加-的字符串.
  • type: 选项的值类型,值的默认类型是字符串, 这里将值指定为其他类型.
  • default: 缺省值. 没有设置缺省值的为None.
  • help: 选项中有 -h 时打印的 help 信息.
  • metavar: 表示显示到 help 中选项的默认值;
  • choices: 当 type 设置为 choices 时,需要设置此值.
  • const: 指定一个常量值给选项, 该常量值将用于后面store_const和append_const,一起合用.
  • action: 用于控制对选项和参数的处理,像无参数选项处理,可以设置为以下几种字符串:
    • "store": 储存值到 dest 指定的属性,强制要求后面提供参数;
    • "store_true": 当使用该选项时,后面的 dest 将设置为 true, 不跟参数.
    • "store_false": 当使用该选项时,后面的 dest 将设置为 false. 常配合另一个 "store_true" 的选项使用同一个 dest 时使用. 不跟参数.
    • "append": 储存值到 dest 指定的属性,并且是以数组的形式, 必须跟参数.
    • "store_const": 用来存储参数为 const 设置的值到 dest 指定的属性当中.常用于 dest 为同名2个以上选项时的处理. 不跟参数.
    • "append_const": 用来存储参数为 const 设置的数组到 dest 指定的属性当中. 不跟参数.
    • "count": 使用后将给储存值到 dest 指定的属性值加1,可以统计参数中出现次数.用途不大. 不跟参数.
    • "callback": 后面指定回调函数名(不加括号),会将相应opt和args传给回调函数.
    • "help", "version": 对应为帮助和版本. 要另外自己设计时使用.

当 action 设置为 store_ture / store_false 时, 解析参数时, 如果有值时为 Ture / False, 没有值时为 None.
当 dest 相同时, 一个 action 设置为 store_false, 另一个 action 设置为 store_ture 时, 解析参数时,以在后面出现的为准.

参数详细.

选项相关函数:

  • 可以用来同时设置多个选项的默认参数
    def set_default(self, dest, value):

    def set_defaults(self, **kwargs):
  • 检查是否有相应选项
    def has_option(self, opt_str):
  • 删除选项
    def remove_option(self, opt_str):

eg.

parser = OptionParser()
parser.add_option('-f', '--file', action='store', dest='file', help='file to handle')
if parser.has_option('-f'):
    print('content -f')
    parser.set_default('-f', 'myFile')
    parser.remove_option('-f')

if not parser.has_option('-f'):
    print('do not content -f')

输出

content -f
do not content -f
  • 添加选项组 add_option_group()
    如果 options 很多的时候, 可以进行分组,然后进行添加. 分组的好处是, 对一系列程序参数可以分一个组,如果有独立的 description , 可以另外处理.使用如下:
group = OptionGroup(parser)  #创建分组
group.add_option() #添加选项
parser.add_option_group(group) #将分组加入到解释器
  • 添加选项数组 add_options([Option1,…])
    将各个Option对象放在一个列表里再一起添加.

参数解析 parse_args()

使用 parse_args() 对参数进行解析,默认是使用 sys.argv[1:] 作为参数, 也可以传递一个命令行参数列表: parse_args(list).

parse_args() 返回的两个值:

  • options,它是一个对象,保存有命令行参数值。只要知道命令行参数名,如 input,就可以访问其对应的值:options.input 。
  • args ,它是没被解析的命令行参数的列表。

帮助文档

默认自动带有 -h 和 --help 来输出帮助文档, 输出后程序终止.
帮助文档由三部分组成:

  1. usage 帮助部分,
    usage 帮助部分一般在 OptionParser 初始化时输入,为第一个参数, 也可以用具体形参名指定. 可以使用 %prog 来表示当前的程序名.

  2. description 描述部分
    在初始化 OptionParser 时 description 形参指定的内容.

  3. 选项以及选项说明部分
    选项加入时定义的说明文字

OptionParser 的形参 version 可以指定 --version 输出的字符串, 同样支持%prog, 如 version="%prog 1.0"

# 一个帮助文档解释字符串
hstr = '%prog custom help string'
parser = OptionParser(hstr, description='custom description')

get_usage(), get_description(), get_version(): 获得对应的字符串.
print_help(), print_usage(), print_description(), print_version(): 输出相应内容
error(str): 出错并输出str.

引用
Python分析命令行输入:OptParse模块

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

推荐阅读更多精彩内容

  • getopt:和C中的getopt()等价。optparse:2.7后已不推荐使用。argparse:基于optp...
    顾慎为阅读 8,686评论 1 10
  • sys.argv sys.argv[0]是脚本文件的名字,如:test.py sys.argv[1:]是以空格分割...
    f9f73935e28c阅读 21,078评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 从小我们就被教育,做事情要坚持,只有坚持到底才能获得胜利。如果中途放弃,那便会前功尽弃,一无所获。真的是这样吗? ...
    张七造梦阅读 6,561评论 0 3
  • 本文参加#感悟三下乡,青春筑梦行#活动,本人承诺,文章内容为原创,且未在其他平台发表过。 2017年6月2...
    742ee6c53289阅读 247评论 0 0