0%

Python(十一)- 命令行参数选项解析

Python中模块和库比较丰富,这里记录一下关于命令行解析相关的模块。

1.sys 系统模块

通常,初学者都会使用 sys.argv收集命令行参数(执行py文件的参数选项,得到一个参数列表,
通过切片和索引可以获取相应的选项和参数,继而去做相应的业务逻辑处理。

2.docopt 模块

docopt 是一个参数解析的库,与众不同的是在代码的最开头使用”””文档注释的形式写出符合要求的文档,会自动生成对应的parse。

以 docopt_parse.py 文件为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
"""
Usage:
docopt_parse.py (-h | --help)
docopt_parse.py (-v | --version)
docopt_parse.py (-i | --input) <infile>
docopt_parse.py (-o | --output) <outfile>
docopt_parse.py info
docopt_parse.py list <names>...

Arguments:
infile optional input file
outfile optional output file
names many names

Options:
-h, --help Show help
-v, --version Show version
-i, --input Input of file
-o, --output Output to file
info Get object information
list Get some files list

Examples:
docopt_parse.py -i filename
"""

from docopt import docopt

if __name__ == '__main__':
args = docopt(__doc__, version='1.0.0')
# print(args)
print('---------------------------------------')
kwargs = {
'info': args['info'],
'get_list': args['list'],
'names': args['<names>'],
'outfile': args['<outfile>'],
'infile': args['<infile>'],
'help': args['--help'],
'version': args['--version'],
}
print(kwargs)

Tips:

  • 分段显示,段落之间空一行,避免模块解析错误

其中

  • Usage 为用法示例,
  • Arguments 为参数说明,
  • Options 为选项说明,
  • Examples 为样例

运行示例:

1
python docopt_parse.py -o out-test.txt

结果

1
2
{'info': False, 'get_list': False, 'get_count': False, 'names': [], 'suffix_name': None, 'outfile': 'out-test.txt', 'infile': None, 'help': False, 'version'
: False}

用得好的话,这会是一个不错的选择。

3.getopt 模块

该模块有两个主要函数,两个属性(主要用来抛出错误信息)。

  • 函数:

    • getopt.getopt
    • getopt.gnu_getopt
  • 属性:

    • getopt.error
    • getopt.GetoptError

这里主要说一下 getopt.getopt() 函数

opts, args = getopt.getopt(args, shortopts, longopts=[])函数

参数解释

  • args 指的是当前脚本接收的参数,它是一个列表,可通过 sys.argv 获得
  • shortopts 是短选项格式,即:”-“ 号后面要紧跟一个选项字母。如:-h
  • longopts 是长选项格式,即:”–” 号后面跟一个完整单词。如果选项含有附加参数,后面要紧跟 “=”,再加上参数,且 “=” 号前后不能有空格。

返回值

  • opts:解析出的格式信息,为一个两元组(选项+参数)组成的列表。
  • args:格式信息之外的剩余命令行参数组成的列表。

Tips

  • 当选项后面是带一个附加参数时,在分析串中写入选项字符同时后面加一个”:”号。如:getopt.getopt(sys.argv[1:], 'ho:', ['help','output=']),其中:ho: 表示两个选项,对应短选项 -h-o

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import getopt
import sys


def test():
print(sys.argv[1:])
print('----------------------')
opts, args = getopt.getopt(sys.argv[1:], 'ho:', ['help','output='])
print('opts: ', opts)
print('args: ', args)


if __name__ == '__main__':
test()

运行示例:

1
python getopt_parse.py -h amazing why mytest

结果

1
2
3
4
['-h', 'amazing', 'why', 'mytest']
----------------------
opts: [('-h', '')]
args: ['amazing', 'why', 'mytest']

4.optparse 模块

optparse 是 python 内置模块,功能也很强大。

4.1.基本用法

使用 OptionParser 类来解析:

  • 导入

    1
    from optparse import OptionParser
  • 构造解析器

    1
    parser = OptionParser(usage='自定义帮助信息')
  • 添加解析规则

    1
    2
    3
    parser.add_option(*args, **kwargs)
    # or
    parser.add_options(option_list)
  • 调用解析函数

    1
    opts, params = parser.parse_args(args=None, values=None)

返回值

  • opts: 一个Python字典,add_option 中添加规则的 dest 参数值为 key,default 值 或 用户输入参数值 作为 value。
  • params: 用户传入的规则之外的 剩余参数 组成的列表。

4.2.案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import optparse


def opt_func(uargs=None):
"""命令行解析"""
# 创建解析类
usage = '\n\t--- 帮助信息 ---\n\t' \
'program_name.py (-v | --version)\n\t' \
'program_name.py (-h | --help)\n\t' \
'program_name.py (-f | --file) filename\n\t' \
' \n' \
'Examples: \n\tpython program_name.py [options] <params>'
parser = optparse.OptionParser(usage=usage)
# 添加解析规则
parser.add_option('-f', '--file', action='store', type='string', dest='filename', help='-f 操作文件(参数说明信息)')
parser.add_option('-v', '--version', action='store_false', dest='version', default='1.0.0', help='-v 版本信息(参数说明信息)')
return parser.parse_args(uargs)


def test():
"""测试"""
# 无参
opts, params = opt_func()
print('opts-1: ', opts)
print('params-1: ', params)
print('-------------------------')

# 用户输入
args = ['-f', 'file.txt', '-v', 'this is a test', 'last arg']
opts, params = opt_func(args)
print('opts-2: ', opts)
print('params-2: ', params)
print('-------------------------')

# 帮助信息
opt_func(['-h'])


if __name__ == '__main__':
test()

option中参数的含义

  • type:用于检测命令行入参的数据类型
  • action:告诉程序在遇到指定选项时,如何处理
  • dest:用于保存入参选项的值,通过 options 访问
  • default:dest的默认值,在用户未输入时分配
  • help:生成帮助说明信息

运行示例

1
python optparse_test.py

结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
opts-1:  {'filename': None, 'version': '1.0.0'}
params-1: []
-------------------------
opts-2: {'filename': 'file.txt', 'version': False}
params-2: ['this is a test', 'last arg']
-------------------------
Usage:
--- 帮助信息 ---
program_name.py (-v | --version)
program_name.py (-h | --help)
program_name.py (-f | --file) filename

Examples:
python program_name.py [options] <params>

Options:
-h, --help show this help message and exit
-f FILENAME, --file=FILENAME
-f 操作文件(参数说明信息)
-v, --version -v 版本信息(参数说明信息)

------------- 本文已结束 感谢您的阅读! -------------
Donate comment here.

本文标题:Python(十一)- 命令行参数选项解析

文章作者:Jusheng Yao

发布时间:2020年04月11日 - 23:42

最后更新:2020年04月12日 - 21:09

原始链接:http://yaojusheng.github.io/archives/2d2f30d0.html

版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道