有没有办法说服 python 的 getopt 处理选项的可选参数?

发布于 2024-08-07 04:37:53 字数 675 浏览 12 评论 0原文

根据 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)

结果是:

$ ./testopt.py -v
option -v requires argument
$ ./testopt.py -v 1
verbosity is 1

According to the documentation on python's getopt (I think) the options fields should behave as the getopt() function. However I can't seem to enable optional parameters to my code:

#!/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)

Results in:

$ ./testopt.py -v
option -v requires argument
$ ./testopt.py -v 1
verbosity is 1

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

沫离伤花 2024-08-14 04:37:53

getopt 不支持可选参数。如果选项很长,您可以这样做:

$ ./testopt.py --verbose=

这将导致空字符串值。

您可以找到 argparse 模块更加灵活。这取代了旧的 optparse模块。

getopt doesn't support optional parameters. in case of long option you could do:

$ ./testopt.py --verbose=

which will result in empty-string value.

You could find argparse module to be more flexible. This replaces the older optparse module.

西瑶 2024-08-14 04:37:53

不幸的是,没有办法。来自 optparse 文档

通常,给定的选项要么带参数,要么不带参数。很多人想要一个“可选选项参数”功能,这意味着某些选项如果看到它就会接受参数,如果没有则不会。这有点有争议,因为它使解析变得不明确:如果“-a”采用可选参数,而“-b”完全是另一个选项,那么我们如何解释“-ab”?由于这种歧义,optparse 不支持此功能。

编辑:哎呀,这是针对 optparse 模块而不是 getopt 模块,但是两个模块都没有“可选选项参数”的原因对于两者来说是相同的。

Unfortunately, there is no way. From the optparse docs:

Typically, a given option either takes an argument or it doesn’t. Lots of people want an “optional option arguments” feature, meaning that some options will take an argument if they see it, and won’t if they don’t. This is somewhat controversial, because it makes parsing ambiguous: if "-a" takes an optional argument and "-b" is another option entirely, how do we interpret "-ab"? Because of this ambiguity, optparse does not support this feature.

EDIT: oops, that is for the optparse module not the getopt module, but the reasoning why neither module has "optional option arguments" is the same for both.

画尸师 2024-08-14 04:37:53

您可以使用 getopt 执行可选参数,如下所示:

import getopt
import sys

longopts, shortopts = getopt.getopt(sys.argv[1:], shortopts='', longopts=['env='])
argDict = dict(longopts)

if argDict.has_key('--env') and argDict['--env'] == 'prod':
    print "production"
else:
    print "sandbox"

用法:

$ python scratch.py --env=prod
production

$ python scratch.py --env=dev
sandbox

$ python scratch.py
sandbox

You can do an optional parameter with getopt like this:

import getopt
import sys

longopts, shortopts = getopt.getopt(sys.argv[1:], shortopts='', longopts=['env='])
argDict = dict(longopts)

if argDict.has_key('--env') and argDict['--env'] == 'prod':
    print "production"
else:
    print "sandbox"

Usage:

$ python scratch.py --env=prod
production

$ python scratch.py --env=dev
sandbox

$ python scratch.py
sandbox
ゃ懵逼小萝莉 2024-08-14 04:37:53

如果您使用的是 2.3 或更高版本,您可能需要尝试 optparse 模块相反,因为它“更方便、更灵活、更强大……”,而且更新。唉,正如 Pynt 回答的那样,似乎不可能完全得到你想要的东西。

If you're using version 2.3 or later, you may want to try the optparse module instead, as it is "more convenient, flexible, and powerful ...", as well as newer. Alas, as Pynt answered, it doesn't seem possible to get exactly what you want.

橘虞初梦 2024-08-14 04:37:53

python 的 getopt 应该真正支持可选参数,就像 GNU getopt 需要 '='
指定参数时使用。现在你可以很容易地模拟它,
有了这个约束,通过隐式地将 --option 更改为 --option=

IE,您可以指定 --option 需要一个参数,
然后将 --option 调整为 --option= 如下:

for i, opt in enumerate(sys.argv):
    if opt == '--option':
        sys.argv[i] = '--option='
    elif opt == '--':
        break

python's getopt should really support optional args, like GNU getopt by requiring '='
be used when specifying a parameter. Now you can simulate it quite easily though,
with this constraint by implicitly changing --option to --option=

I.E. you can specify that --option requires an argument,
and then adjust --option to --option= as follows:

for i, opt in enumerate(sys.argv):
    if opt == '--option':
        sys.argv[i] = '--option='
    elif opt == '--':
        break
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文