我正在为命令行程序编写一些代码,并且正在使用该getopt()
函数。有人可以解释 options / long_options 语法吗?
getopt.getopt(args, options[, long_options])
我的问题是这样的:
为什么列表在参数之间是零散的?为什么是选项[不是选项?
该函数有 2 个必需的参数 (args
和options
) 和一个不需要的选项 ( long_options
)。的确切含义args
,options
并且long_options
都可以在文档中找到
基本上,如果您希望将命令行解析为:
myprogram --foo=bar
然后你需要有一个long_options
类似于 的列表['--foo=']
,但如果你想将其解析为:
myprogram -f bar
那么您将options
设置为'f:'
. 当然,你可以随意混搭。
对于它的价值,我永远不会推荐任何人使用getopt
赞成optparse
或(甚至更好)argparse
。后面的这两个模块让getopt
你感觉像是在用锤子给自己建造一台新电脑......
您应该使用现在已弃用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
页都使用该约定!
我希望这次我确实回答了你的问题!
参数args
和options
是强制性参数,而 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