解析命令行选项

介绍

ParseOptions类处理通过argc和argv给main()的命令行选项的解析。首先,我们举例说明如何从命令行调用典型的Kaldi程序:

  gmm-align --transition-scale = 10.0 --beam = 75 \
       exp / mono / tree exp / mono / 30.mdl data / L.fst \
       'ark:add-deltas --print-args = false scp:data / train.scp ark: -  |' \
        ark:data / train.tra ark:exp / tri / 0.ali

命令行选项只有长格式(没有单字母选项),必须出现在位置参数之前。在这种情况下,有六个位置参数,从"exp/mono/tree"; 请注意,以一个开头的"ark:add-deltas"是一个包含空格的单个字符串; 单引号由shell解释; 此参数作为管道调用。

解析命令行选项的示例

我们将通过介绍gmm-align.cc中的一些代码来说明如何在C ++级别处理这些选项(我们稍微修改了它以使其更清晰):

int main(int argc, char *argv[])
{
  try { // try-catch block is standard and relates to handling of errors.
    using namespace kaldi;
    const char *usage =
        "Align features given [GMM-based] models.\n" 
        "Usage: align-gmm [options] tree-in model-in lexicon-fst-in feature-rspecifier "
        "transcriptions-rspecifier alignments-wspecifier\n";
    // Initialize the ParseOptions object with the usage string.
    ParseOptions po(usage);
    // Declare options and set default values.
    bool binary = false;
    BaseFloat beam = 200.0;
    // Below is a structure containing options; its initializer sets defaults.
    TrainingGraphCompilerOptions gopts;
    // Register the options with the ParseOptions object.
    po.Register("binary", &binary, "Write output in binary mode");
    po.Register("beam", &beam, "Decoding beam");
    gopts.Register(&po);
    // The command-line options get parsed here.
    po.Read(argc, argv);
    // Check that there are a valid number of positional arguments.
    if(po.NumArgs() != 6) {
      po.PrintUsage();
      exit(1);
    }
    // The positional arguments get read here (they can only be obtained
    // from ParseOptions as strings).
    std::string tree_in_filename = po.GetArg(1);
    ...
    std::string alignment_wspecifier = po.GetArg(6);
    ...   
  } catch(const std::exception& e) {
    std::cerr << e.what();
    return -1;
  }
}
int  main(int argc,char * argv [])
{
  try { // try-catch块是标准的,与错误的处理有关。
    使用命名空间kaldi ;
    const  char * usage =
        “根据[基于GMM的]模型对齐特征。\ n” 
        “用法:align-gmm [options] tree-in model-in lexicon-fst-in feature-rspecifier”
        “transcriptions-rspecifier alignments-wspecifier \ n” ;
    //使用用法字符串初始化ParseOptions对象。
    ParseOptions po(用法);
    //声明选项并设置默认值。
    bool binary = false ;
    BaseFloat beam = 200.0;
    //下面是一个包含选项的结构; 其初始化程序设置默认值。
    TrainingGraphCompilerOptions gopts;
    //使用ParseOptions对象注册选项。
    婆。寄存器(“二进制”,&二进制,“以二进制模式写入输出”);
    po.Register(“beam”,&beam,“Decoding beam”);
    gopts。注册(&po);
    //这里解析命令行选项。
    po.Read(argc,argv);
    //检查是否存在有效数量的位置参数。
    if(po.NumArgs()!= 6){
      po.PrintUsage();
      出口(1);
    }
    //这里读取位置参数(只能获取它们
    //从ParseOptions作为字符串)。
    std :: string tree_in_filename = po.GetArg(1);
    ...
    std :: string alignment_wspecifier = po.GetArg(6);
    ...   
  } catch(const std :: exception&e){
    std :: cerr << e.what();
    返回 -1;
  }
}

上面的代码大多是不言自明的。在正常的Kaldi程序中,顺序如下:

  • 使用用法字符串初始化ParseOptions对象。
  • 您为可选参数(和选项结构)声明并设置默认值。
  • 您可以使用ParseOptions对象注册命令行选项(选项结构具有自己的注册函数,这些函数对它们包含的所有变量执行相同的操作)。
  • 你做“po.Read(argc,argv);” [如果给出无效选项,这将退出程序]
  • 您检查位置选项的数量po.NumArgs()是否在程序的有效范围内。
  • 你用po.GetArg(1)等等获得位置参数; 对于可能超出范围的可选位置参数,便捷函数po.GetOptArg(n)返回第n个参数,如果n超出范围,则返回空字符串。

通常在编写新的命令行Kaldi程序时,最简单的方法是复制现有的程序并对其进行修改。

隐式命令行参数

某些命令行选项由ParseOptions对象本身自动注册。其中包括:

  • –config此选项从配置文件加载命令行选项。例如,如果我们执行-config = configs / my.conf,该文件my.conf可能包含:
          --first-option = 15#这是第一个选项
          --second-option = false#这是第二个选项
    
          --second-option = false#这是第二个选项
    
  • –print-args此布尔选项控制程序是否将命令行参数打印到标准错误(默认为true); –print-args=false将关闭它。
  • –help这个boolean参数,如果为true将导致程序打印出一个用法消息(就像其他布尔参数一样,只–help计为true)。您通常可以通过省略所有命令行参数来获取用法消息,因为大多数程序都需要位置参数。
  • –verbose这将控制详细级别,以便打印出使用KALDI_VLOG记录的消息。更高(例如-verbose = 2是典型的)。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 Python 中,可以使用 argparse 模块来解析命令参数。以下是一个简单的示例: ```python import argparse parser = argparse.ArgumentParser(description='Process some integers.') parser.add_argument('integers', metavar='N', type=int, nargs='+', help='an integer for the accumulator') parser.add_argument('--sum', dest='accumulate', action='store_const', const=sum, default=max, help='sum the integers (default: find the max)') args = parser.parse_args() print(args.accumulate(args.integers)) ``` 这个示例程序可以接受一个或多个整数作为参数,并且可以使用 --sum 选项来指定是求和还是求最大值。例如: ``` $ python argparse_example.py 1 2 3 4 4 $ python argparse_example.py 1 2 3 4 --sum 10 ``` 在这个示例中,我们首先创建了一个 ArgumentParser 对象,并且指定了程序的描述信息。然后,我们使用 add_argument() 方法来定义可接受的参数。其中,'integers' 是参数的名称,metavar='N' 指定了参数的元变量名为 N,type=int 表示参数应该被解析成整数类型,nargs='+' 表示参数可以接受一个或多个值,help 参数是一个帮助字符串,用于描述参数的作用。 接下来,我们使用 add_argument() 方法来定义一个可选的 --sum 选项。其中,dest='accumulate' 指定了选项的目标属性名为 accumulate,action='store_const' 表示如果选项被指定了,那么 accumulate 属性将被赋值为 const 参数指定的值,否则将被赋值为 default 参数指定的值。在这个示例中,const=sum 表示如果 --sum 选项被指定了,那么 accumulate 属性将被赋值为 sum 函数,否则将被赋值为 max 函数。help 参数用于描述选项的作用。 最后,我们使用 parse_args() 方法来解析命令参数,并且将结果存储在 args 对象中。然后,我们根据 accumulate 属性的值来计算输入的整数的和或最大值,并将结果打印出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落雪snowflake

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值