根据python的文档getopt(我认为),选项字段应该表现为getopt()函数.但是我似乎无法为我的代码启用可选参数:
#!/usr/bin/python
import sys,getopt
if __name__ == "__main__":
try:
opts, args = getopt.gnu_getopt(sys.argv[1:], "v::", ["verbose="])
except getopt.GetoptError, err:
print str(err)
sys.exit(1)
for o,a in opts:
if o in ("-v", "--verbose"):
if a:
verbose=int(a)
else:
verbose=1
print "verbosity is %d" % (verbose)
Run Code Online (Sandbox Code Playgroud)
结果是:
$ ./testopt.py -v
option -v requires argument
$ ./testopt.py -v 1
verbosity is 1
Run Code Online (Sandbox Code Playgroud) 如果我这样做:
GetOptions(
'u=s' => \$in_username,
'r=i' => \$in_readonly,
'b=i' => \$in_backup
);
exit usage() unless $in_username && $in_readonly && $in_backup;
Run Code Online (Sandbox Code Playgroud)
并调用这样的程序:
./app.pl -u david -r 12 -b 0
Run Code Online (Sandbox Code Playgroud)
它总是导致调用usage(),所以显然0不被视为整数值.我能做什么接受整数值AND 0?
是否可以关闭缩写getopt_long()?从手册页:
如果缩写是唯一的或者与某些定义的选项完全匹配,则可以缩写长选项名称。
我想这样做是因为我收到的一段代码的规范要求标志的全长精确匹配,并且有很多标志。
#!/usr/bin/perl -sw
use strict;
use warnings;
use Getopt::Long;
my $remote = 0;
my $test = 0;
GetOptions ('remote' => \$remote, 'test' => \$test);
print "$remote:$test\n";
Run Code Online (Sandbox Code Playgroud)
perl test.pl --remote --test
以上打印"0:0".我是Perl的新手,所以我无法确定为什么这不起作用.
我还运行了http://perldoc.perl.org/Getopt/Long.html#Simple-options中的"简单选项"部分,但也没有产生任何内容.
例如,选项数组是:
static struct option const long_options[] =
{
{"help", no_argument, 0, 'h'},
{"version", no_argument, 0, 'v'},
{0, 0, 0, 0}
};
Run Code Online (Sandbox Code Playgroud)
是填充吗?
使用C/C++,getopt_long()可用于解析命令行参数.是否有可能告诉函数某些选项是强制性的?例如,getopt_long如果startServer在不提及下面的端口的情况下调用,我怎么能告诉解析应该给出错误?
./startServer -port 80
注意:我不是说选项参数是强制性的,而是选项本身.
我的目标是有一个--override=f选项来操纵其他两个选项的值.诀窍是解决如何参考选项的值(匹配部分f中=f的标志符)sub的是执行的时候GetOptions检测在命令行上的选项的存在.
我是这样做的:
$ cat t.pl
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
our %Opt = (
a => 0,
b => 0,
);
our %Options = (
"a=f" => \$Opt{a},
"b=f" => \$Opt{b},
"override=f" => sub { $Opt{$_} = $_[1] for qw(a b); }, # $_[1] is the "trick"
);
GetOptions(%Options) or die "whatever";
print "\$Opt{$_}='$Opt{$_}'\n" for keys %Opt;
$ t.pl --override=5
$Opt{a}='5'
$Opt{b}='5'
$ t.pl --a=1 --b=2 --override=5 --a=3
$Opt{a}='3'
$Opt{b}='5' …Run Code Online (Sandbox Code Playgroud) 我正在使用该Getopt::Long模块来处理命令行参数.
这个模块的典型行为是我们可以传递-f而不是变量的全名--file.同时,如果我有另一个命令行变量--find,并且如果我只-f在命令提示符下提供,它将返回错误:
Option f is ambiguous (file, find).
Run Code Online (Sandbox Code Playgroud)
我想知道我们怎样才能抑制这种模棱两可的用法呢?
提前致谢.
我正在学习如何使用getopt和*getopt_long*.一个问题是,当我使用gdb逐步运行以下简单程序时,optarg始终为0x0.
你知道为什么吗?这是gdb的问题吗?
我试图搜索网络并查看程序的汇编代码,但尚未找到答案.
调试代码表明optarg按预期指向agv [3](值"16").
#include <unistd.h>
#include <getopt.h>
#include <stdio.h>
static struct option options[] =
{
/* name has_arg flag val */
{ "num", 1, NULL, 'n' },
{ NULL , 0, NULL , 0 }
};
int main(int argc, char** argv)
{
int option;
option = getopt_long( argc, argv, "n:", options, NULL );
if (option == 'n') {
printf("%s\n", optarg);
if (optarg == NULL)
printf("optarg == NULL\n");
if (optarg == …Run Code Online (Sandbox Code Playgroud) 我使用getopt来解析用C++编写的CLI的输入.我有long和short选项,我的struct long_options []元素看起来像这样:
{"verbose", no_argument, NULL, "v"}
Run Code Online (Sandbox Code Playgroud)
一个观察是 - 在命令行上,即使我通过了
# mycommand --verb
Run Code Online (Sandbox Code Playgroud)
它仍然接受并路由到处理详细行为的函数.有没有办法让getopt做一个严格的选项检查?它不应该接受--verb as --verbose对吗?