为什么getopt方法有getopt(args,options [,long_options])而不是getopt(args,options,[long_options])作为它的签名?

时间:2013-06-12 18:28:42

标签: python getopt

我正在为命令行程序编写一些代码,而我正在使用getopt()函数。 有人可以解释options / long_options语法吗?

getopt.getopt(args, options[, long_options])

我的问题是:

为什么列表在参数之间分散?为什么选择[不是选项?

3 个答案:

答案 0 :(得分:2)

该函数有2个必需参数(argsoptions)和一个不需要的选项(long_options)。 args

中可以找到optionslong_optionsmyprogram --foo=bar 的确切含义

基本上,如果您希望将命令行解析为:

long_options

然后你需要有一个类似['--foo=']的{​​{1}}列表,但是如果要将其解析为:

myprogram -f bar

然后您将options设置为'f:'。当然,您可以根据需要混合搭配。

为了它的价值,我永远不会建议任何人使用getopt支持optparse或(甚至更好)argparse。这些后来的两个模块使getopt感觉就像试图用锤子建立自己的新计算机......

答案 1 :(得分:0)

您应该使用argparse而不是getopt,现在已弃用。关于解释,文档真的可以访问:

关于你的具体问题,我想你会在那里得到答案:

(请阅读thisthat以了解您应该使用argparse的原因;甚至getopt文档状态(原文如此)“不熟悉的用户C getopt()函数或想要编写更少代码并获得更好帮助和错误消息的人应该考虑使用argparse模块。“)

在最后编辑之后:在文档中,您会看到原型的一部分被方括号括起来,按照惯例,这意味着该部分是可选的,而之前的部分是必需的。如果您想致电getopt.getopt()评估args和期权。

现在,它不是getopt.getopt(args, options, [long_options])因为它意味着最后一个逗号也是强制性的,但如果你调用getopt.getopt(args, options,)它不是一个有效的python表达式。

在最后的评论之后:嗯,这个语法是unix平台上几乎所有工具都使用的惯例......我不知道它是否已在某处定义,但我不会如果它比POSIX规范本身更老,那就会感到惊讶!我能找到的唯一“文档”是以下维基百科页面,但它没有引用:

我在caltech找到了一门课程(查找部分“用法语句中的可选参数”),它告诉我们使用方括号作为可选参数:

最后你不是第一个在堆栈溢出问这里的问题,在同一主题上至少还有两个问题:

如果您查看系统上的联机帮助页,您会看到所有这些使用该语法,方括号中的所有参数都是可选,例如:ls manpage,{{3}即使是macos'cat manpage也使用该约定!

我希望这次我确实回答了你的问题!

答案 2 :(得分:0)

参数argsoptions是必需参数,long_options是函数的可选参数,即它可能提供也可能不提供。 如果您打算支持长选项,则可以在命令行实用程序中提供它 --format以及-f

Linux ls实用程序示例,显示选项和长选项,以--

开头
LS(1)                                       User Commands                                       LS(1)

NAME
       ls - list directory contents

SYNOPSIS
       ls [OPTION]... [FILE]...

DESCRIPTION
       List  information about the FILEs (the current directory by default).  Sort entries alphabeti‐
       cally if none of -cftuvSUX nor --sort is specified.

       Mandatory arguments to long options are mandatory for short options too.

       -a, --all
              do not ignore entries starting with .

       -A, --almost-all
              do not list implied . and ..

       --author   <--- LONG OPTIONS OF COMMAND LINE
              with -l, print the author of each file