OptionParser解析命令行参数

1. OptionParser

OptionParser 是python内置的功能非常强大的命令行参数解析模块,它使用灵活,可以方便的生成标准的、符合Unix/Posix 规范的命令行说明,下面用一个非常小的示例来向你展示它的功能和使用方法,创建demo.py文件

import sys
from optparse import OptionParser

parser = OptionParser(
                         usage="python %prog [OPTION]",
                         description="酷python,分享最专业的python技术",
                         version="1.1"
                       )

parser.add_option("-n", "--name", action="store", dest="username", help="姓名")
parser.add_option("-a", "--age", action="store", help="年龄", type=int, default=20)
parser.add_option("-d", "--address", action="store", help="住址", metavar="北京")
parser.add_option("-f", "--friends", action="append", help="朋友")
parser.add_option("-t", "--times", action="count", help="次数")
parser.add_option('-o', "--out", action="store_true", help="是否输出")


if __name__ == '__main__':
    (options, args) = parser.parse_args(sys.argv[1:])
    print(options, args)
    print(options.age)
    print(options.username)

1.1 打印help

OptionParser 可以自动生成程序的help说明,它有助于用户了解程序能够提供的功能,在命令行里行下面的命令

python demo.py --help

输出结果

Usage: python demo.py [OPTION]

酷python,分享最专业的python技术

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -n USERNAME, --name=USERNAME
                        姓名
  -a AGE, --age=AGE     年龄
  -d 北京, --address=北京   住址
  -f FRIENDS, --friends=FRIENDS
                        朋友
  -t, --times           次数
  -o, --out             是否输出

输出help信息时,程序执行完(options, args) = parser.parse_args(sys.argv[1:]) 就会退出。

这些help信息就包含两部分,一部分是创建OptionParser对象时设置的usage和description,一部分是使用add_option添加的参数信息。

usage 是使用示例说明,OptionParser允许传入prog参数,该参数默认是当前所执行的脚本,就本例而言prog的值是demo.py,prog的值被用于格式化usage。description 是对程序功能的描述。

option部分由add_option所添加的参数构成,此外还有--version 和 --help 这两个原生存在的参数。

2. 添加参数

添加命令行选项使用add_option 方法,下面重点讲解该函数的参数。

2.1 选项的名称

选项的名称分短名称和长名称,短名称只能是横杠和一个字母的组合,长名称必须是两个横杠和一个单词的组合。

  1. 短名称 -n
  2. 长名称 --name

这两个名称至少定义一个,都不定义是错误的。

在命令行传入参数时,任选其一使用,但要注意使用的方法有区别:

  1. -n cool 短名称与值之间使用空格
  2. --name=cool 长名称与值之间使用等号

2.2 action 选项的动作

这个参数有以下值可用:

  1. store 将选项值存储到目标变量, action默认值是store
  2. store_true 如果出现该选项,将目标变量设置为True,示例中选项out的action是store_true,实际使用时无需为out设置value,只要命令行里出现-o 或者--out, 就会将True赋值给out
  3. store_false 参考store_true
  4. append 将选项值追加到列表中,一旦action设置为append,目标变量的类型就是列表,无需为该选项设置value
  5. count 每出现一次该选项,目标变量的极速器就加1 ,无需为该选项设置value

下面的4个实例分别演示action在取不同值时的效果

# store
python demo.py -n cool

{'username': 'cool', 'age': None, 'address': None, 'friends': None, 'times': None, 'out': None} []

# store_true
python demo.py --out

{'username': None, 'age': None, 'address': None, 'friends': None, 'times': None, 'out': True} []

# append
python demo.py -f 小明 -f 小刚

{'username': None, 'age': None, 'address': None, 'friends': ['小明', '小刚'], 'times': None, 'out': None} []

# count
python demo.py -t -t

{'username': None, 'age': None, 'address': None, 'friends': None, 'times': 2, 'out': None} []

2.3 dest 指定选项的目标变量名

dest设置选项的目标变量名,如果不设置这个参数,那么目标变量名是长名称,没有长名称则使用短名称,在上面的示例中,我为姓名设置了dest参数,那么最终的目标变量名就是username

2.4 type

type指定目标变量的类型,以年龄为例,它的类型我设置为int,OptionParser会对传入的值做类型转换,如果你传入字符串会报错

python demo.py -a fff

Usage: python demo.py [OPTION]

demo.py: error: option -a: invalid integer value: 'fff'

2.5 default

为选项设置默认值,如果命令行里没有设置该选项则选项的值为默认值,本示例中age的默认值是20

python demo.py -n cool

{'username': 'cool', 'age': 20, 'address': None, 'friends': None, 'times': None, 'out': None} []

2.6 help

选项的解释说明

2.7 metavar

指定在帮助信息中显示选项值的名称,在示例中,我为住址设置了metavar, 在help信息里你可以看到如下的内容

-d 北京, --address=北京   住址

它的作用是为用户提供单个选项的使用示例。

3. 在命令行里如何设置可选项

在命令行里设置可选项时,可选项的顺序不影响解析,不必非得按照add_option添加选项的顺序设置选项值,顺序可以打乱。

除了这些选项,你仍然可以向程序传递其他参数,解析后,选项的信息保存在options里,参数的信息保存在args

python demo.py -n cool --age=20 -f 小刚 -o test1 test2 test3

{'username': 'cool', 'age': 20, 'address': None, 'friends': ['小刚'], 'times': None, 'out': True} ['test1', 'test2', 'test3']

在为选项设置完值以后,我增加了3个参数,这3个参数不在我所添加的选项里,被识别为args。

arg的添加同样可以不考虑顺序问题,下面的命令同样可以被正确解析

python demo.py -n cool test1 --age=20 test2 -f 小刚 -o  test3

{'username': 'cool', 'age': 20, 'address': None, 'friends': ['小刚'], 'times': None, 'out': True} ['test1', 'test2', 'test3']

但我强烈不建议你这么做,因为看起来太乱了,造成使用时的困惑。

4. 在程序中使用选项的值和参数的值

选项的值存储在options对象中,参数的值以列表的形式存储在args中

if __name__ == '__main__':
    (options, args) = parser.parse_args(sys.argv[1:])
    print(options, args)
    print(options.age)
    print(options.username)

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案