docopt-命令行参数解释器

Posted by mudux on April 13, 2020

1.介绍

  doc-opt在Python中引入了一种针对命令行参数的形式语言,极大的简化了命令行参数解析工作,个人感觉比argparse好用许多。

2.用法

  在代码的最开头加入用”"”文档注释的形式写出的文档注释,就可以自动生成对应的parse。 如下所示(来自Stanford CS224N Assignment 4):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"""
CS224N 2018-19: Homework 4
vocab.py: Vocabulary Generation
Pencheng Yin <pcyin@cs.cmu.edu>
Sahil Chopra <schopra8@stanford.edu>

Usage:
    vocab.py --train-src=<file> --train-tgt=<file> [options] VOCAB_FILE

Options:
    -h --help                  Show this screen.
    --train-src=<file>         File of training source sentences
    --train-tgt=<file>         File of training target sentences
    --size=<int>               vocab size [default: 50000]
    --freq-cutoff=<int>        frequency cutoff [default: 2]
"""

  然后在main加入:

1
args = docopt(__doc__)

  就会在程序中生成一个字典,在上述例子中,生成字典为:

1
2
3
4
5
6
{'--freq-cutoff': '2',
 '--help': False,
 '--size': '50000',
 '--train-src': './en_es_data/train.es',
 '--train-tgt': './en_es_data/train.en',
 'VOCAB_FILE': 'vocab.json'}

  可以看出docopt把命令行参数名当做字典键,对应值作为值。
  所以在程序中可以直接使用args获得对应的参数,如:

1
2
src_sents = read_corpus(args['--train-src'], source='src')
tgt_sents = read_corpus(args['--train-tgt'], source='tgt')

3.详解

  建议直接查看doc-optgithub地址
  形式为:

1
2
3
4
5
6
7
8
9
10
11
Usage: my_program
my_program command --option <argument>
my_program [<optional-argument>]
my_program --another-option=<with-argument>
my_program (--either-that-option | <or-this-argument>)
my_program <repeating-argument> <repeating-argument>...

Options:
  --verbose  MORE text.   # GOOD
  -o FILE  Output file.   # GOOD
Other: --bad  # BAD, line does not start with dash "-"

  Usage和Options参数不区分大小写,Usage后面为程序名,Usage和Options之间每一行为一个可以使用的命令行参数形式。
Usage具体参数形式为:

  • 以”<”和”>”包围的参数为位置参数
  • -o –option两种输入参数形式,-o为简写形式,–option为完整形式
  • [optional elements]表示可选参数,
  • (required elements)表示必须参数
  • element|another为互斥参数
  • element…表示前面参数可重复一次或者多次
  • [options]当有多个可选参数是,可以用[options]简写形式

Options具体形式为:

  • 以”-“或者”–“开头表示一个可选参数
  • 用两个空格分离参数和参数描述
  • 在参数描述里面设置默认值,如
    1
    2
    3
    
      --coefficient=K  The K coefficient [default: 2.95]
      --output=FILE    Output file [default: test.txt]
      --directory=DIR  Some directory [default: ./]
    

  最后看一个CS224N的例子:

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
"""
CS224N 2018-19: Homework 4
run.py: Run Script for Simple NMT Model
Pencheng Yin <pcyin@cs.cmu.edu>
Sahil Chopra <schopra8@stanford.edu>

Usage:
    run.py train --train-src=<file> --train-tgt=<file> --dev-src=<file> --dev-tgt=<file> --vocab=<file> [options]
    run.py decode [options] MODEL_PATH TEST_SOURCE_FILE OUTPUT_FILE
    run.py decode [options] MODEL_PATH TEST_SOURCE_FILE TEST_TARGET_FILE OUTPUT_FILE

Options:
    -h --help                               show this screen.
    --cuda                                  use GPU
    --train-src=<file>                      train source file
    --train-tgt=<file>                      train target file
    --dev-src=<file>                        dev source file
    --dev-tgt=<file>                        dev target file
    --vocab=<file>                          vocab file
    --seed=<int>                            seed [default: 0]
    --batch-size=<int>                      batch size [default: 32]
    --embed-size=<int>                      embedding size [default: 256]
    --hidden-size=<int>                     hidden size [default: 256]
    --clip-grad=<float>                     gradient clipping [default: 5.0]
    --log-every=<int>                       log every [default: 10]
    --max-epoch=<int>                       max epoch [default: 30]
    --input-feed                            use input feeding
    --patience=<int>                        wait for how many iterations to decay learning rate [default: 5]
    --max-num-trial=<int>                   terminate training after how many trials [default: 5]
    --lr-decay=<float>                      learning rate decay [default: 0.5]
    --beam-size=<int>                       beam size [default: 5]
    --sample-size=<int>                     sample size [default: 5]
    --lr=<float>                            learning rate [default: 0.001]
    --uniform-init=<float>                  uniformly initialize all parameters [default: 0.1]
    --save-to=<file>                        model save path [default: model.bin]
    --valid-niter=<int>                     perform validation after how many iterations [default: 2000]
    --dropout=<float>                       dropout [default: 0.3]
    --max-decoding-time-step=<int>          maximum number of decoding time steps [default: 70]
"""