应用场景解决Python命令行应用参数解析;
常用的参数解析方式sys.argv 属性,用于接收来自命令行的输入
optparse 内建模块,用于命令行参数解析
argparse 内建模块,用于命令行参数解析
使用案例
文档名称:doc.py1
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"""
docopt 的练习进程;
Usage:
doc new ...
doc ship move [--speed=] [--moored|--drifting] ...
doc ship shoot
doc mine (set|remove) [--moored|--drifting]
doc other [-abc] [--test=]
doc command [--speed=] [--] ...
doc ARGUMENT
doc -h | --help
doc --version
Options:
-h --help Show this screen.
-s KN --speed=KN Speed in knots [default: 10].
--moored Moored (anchored) mine.
--drifting Drifting mine.
-abc -a -b -c.
-t ,--test test [default: 1].
"""
from docopt import docopt
args = docopt(__doc__, version='0.01')
print(args)查看帮助,python3 doc.py --help,输出:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20PS E:pythonpython_test> python .doc.py --help
docopt 的练习进程;
Usage:
doc new ...
doc ship move [--speed=]
doc ship shoot
doc mine (set|remove) [--moored|--drifting]
doc other [-abc] [--test=]
doc command [--speed=] [--] ...
doc -h | --help
doc --version
Options:
-h --help Show this screen.
-s KN --speed=KN Speed in knots [default: 10].
--moored Moored (anchored) mine.
--drifting Drifting mine.
-abc -a -b -c.
-t ,--test test [default: 1].运行命令,python .doc.py ship arg1 move 3 4 --speed=15 --moored name1 name2 name3,输出:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25PS E:pythonpython_test> python .doc.py ship arg1 move 3 4 --speed=15 --moored name1 name2 name3
{'--': False,
'--drifting': False,
'--help': False,
'--moored': True,
'--speed': '15',
'--test': '1',
'--version': False,
'-a': False,
'-b': False,
'-c': False,
'': [],
'': ['arg1'],
'': ['name1', 'name2', 'name3'],
'': '3',
'': '4',
'command': False,
'mine': False,
'move': True,
'new': False,
'other': False,
'remove': False,
'set': False,
'ship': True,
'shoot': False}
docopt描述语言
usage pattern:用法规则关键字:Usage(不区分大小写)和空行之间的内容被解释为用法列表;
并且Usage之后的第一个单词意义为:应用进程名称;
示例中的Usage和Options之间的都为用法列表,并且以空行分割;1
2
3
4
5
6
7
8
9
10
11Usage:
doc new ...
doc ship move [--speed=] [--moored|--drifting] ...
doc ship shoot
doc mine (set|remove) [--moored|--drifting]
doc other [-abc] [--test=]
doc command [--speed=] [--] ...
doc -h | --help
doc --version
Options:
ARGUMENT:位置选项以结尾的以及全部大写字母的单词都被解释为位置option;
案例中:doc new ...
doc ARGUMENT
的 和ARGUMENT都会被解释为位置option;
-o –option:选项短option可以堆叠,例如:-abc其实是:-a -b -c
长option可以在其后面用空格:或者等号:=分割一个参数,例如:-s KN --speed=KN,-t ,--test
短option声明参数时,后面的空格是可选的,例如:-fFILE 或者: -f FILE
不过这里要注意的是:对于`--option ARGUMENT` 这种表述是模棱两可的,因为不能确定`ARGUMENT`是`--option`的参数还是一个位置option;
例如这种情况:Usage:
app --input ARGUMENT
docopt 对这种情况的解释如下:如果在Options里面声明了选项:`--option ARGUMENT`,那么它将`ARGUMENT`解释为`--option`的值
否则,`--option ARGUMENT`被解释为一个bool option:`--option`和一个位置参数:`ARGUMENT`
`-f FILE` 和 `-fFILE` 情况类似,无法确定`-fFILE`是一个堆叠起来的option还是`FILE`是option`-f`的值;
[optional elements]:可选选项
以下两种用法声明的意义相同:my_program [command --option ]
my_program [command] [--option] []
都表示:coomand,--option,是可选的选项,被用[]包裹的选项都为可选;
(required elements):必选选项
用[]声明的选项是可选的,但是用()声明的选项是必选的;my_program (--either-this | ) # --either-this 或者 必选其一
my_program [()] # 要么不需要参数要么两个参数都选
element|another:互斥选项
-a| -b声明的选项表示-a和 -b 只能选一个,为互斥关系;my_program go (--up | --down | --left | --right) # 四个选项必选且只能选择一个
my_program go [--up | --down | --left | --right] # 四个选项最多只能选择一个,可以不选
my_program (run [--fast] | jump [--high]) # run 或者 run --fase 或者 jump 或者 jump --high
element…:列表选项
可以使用:...声明多个值的选项,被解释为一个列表:my_program open ... # 最终是一个或者多个值;
my_program move ()... # 参数依次赋值给和行程列表,my_program move 3 3 4 5, 为 3 4, 为 3 5;
my_program ... # 至少有两个值;
my_program [...] # 没有值或者有只一个或者多个
my_program []... # 同上
my_program [ [...]] # 没有值或者只有一个或者只有两个或者多个
[options]:所有选项
使用:[options]可以表示所有可选的选项Usage: my_program [options]
--all List everything.
--long Long output.
--human-readable Display in human-readable format.
等价于:Usage: my_program [--all --long --human-readable]
--all List everything.
--long Long output.
--human-readable Display in human-readable format.
然而也可以仅仅列出他们其中的一部分:Usage: my_program [-alh]
-a, --all List everything.
-l, --long Long output.
-h, --human-readable Display in human-readable format.
[--]
[--]:通常用于分割位置参数和[options],防止将位置参数误认为选项
Option descriptions:选项描述
任何以-或者--开头的行都被认为是选项声明,选项描述通常是可以声明:长选项和短选项意义相同,用法:-v --verbose
选项参数,用法:-o FILE --output=FILE或者-i , --input
选项默认值,用法:[default: ]
例如:Options:
-o FILE --output=FILE # without comma, with "=" sign
-i , --input # with comma, without "=" sign
-q Quit. # 选项声明后面用最少两个空格分割描述;
-p FILE Output file. # GOOD
--stdout Use stdout. # GOOD, 2 spaces
--coefficient=K The K coefficient [default: 2.95]
--output=FILE Output file [default: test.txt]
--directory=DIR Some directory [default: ./]
参考网站