0

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

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

我的问题是这样的:

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

4

3 回答 3

2

该函数有 2 个必需的参数 (argsoptions) 和一个不需要的选项 ( long_options)。的确切含义argsoptions并且long_options都可以在文档中找到

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

myprogram --foo=bar

然后你需要有一个long_options类似于 的列表['--foo='],但如果你想将其解析为:

myprogram -f bar

那么您将options设置为'f:'. 当然,你可以随意混搭。

对于它的价值,我永远不会推荐任何人使用getopt赞成optparse或(甚至更好)argparse。后面的这两个模块让getopt你感觉像是在用锤子给自己建造一台新电脑......

于 2013-06-12T18:31:30.130 回答
0

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

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

(阅读这个那个以了解您为什么应该使用argparse;甚至getopt文档状态(原文如此)“不熟悉 C getopt() 函数或希望编写更少代码并获得更好帮助和错误消息的用户应该考虑使用argparse 模块代替。 ")

上次编辑后:当您在文档中看到原型的一部分被方括号包围时,按照惯例,这意味着该部分是可选的,而之前的部分是强制性的。当你想打电话时,getopt.getopt()应该评估args和选择`。

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

最后评论后:嗯,该语法是在 unix 平台上存在的几乎所有工具中使用的约定......我不知道它是否已在某个地方定义,但如果它比 POSIX 规范更早,我不会感到惊讶本身!我能找到的唯一“文档”是以下维基百科页面,但它缺少参考:

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

最后,您不是第一个在堆栈溢出问题上提出这个问题的人,至少还有两个关于同一主题的其他问题:

如果您查看系统上的手册页,您会看到所有这些手册页都使用该语法,方括号中的所有参数都是可选的,例如:手册ls、手册cat,甚至 macos 的手册open都使用该约定!

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

于 2013-06-12T18:31:54.543 回答
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
于 2013-06-12T18:35:18.820 回答