3

如果它已经在某处得到回答,我提前道歉;自上一小时以来,我一直在 python 站点。但并没有完全弄清楚我该怎么做。我的脚本应该采用如下选项:

myScript.py -f <file-name> -e [/ -d]
myScript.py -s <string> -e [/ -d]
myScript.py -f <file-name> [/ -s <string>] -e -w [<file_name>]

-f/ -s, -e/-d是强制性选项,但-f&-s不能一起使用,并且与-e&-d选项相同 - 不能一起使用。我怎样才能把支票到位?

另一个问题,如果我可能同时问:我如何使用-w选项(使用时)或 w/oa 值?如果未提供任何值,则应采用默认值,否则采用提供的值。非常感谢任何帮助。干杯!!

4

2 回答 2

2

argparse如果您使用的是 2.7+ ,则应该尝试使用。这部分应该是你想要的。

Tl;博士:

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('--foo', action='store_true')
group.add_argument('--bar', action='store_false')

使--foo--bar互斥。argparse有关使用ArgumentParsers的更多信息,请参阅详细用法

请记住,optparse它已被弃用,因此argparse无论如何使用都是一个好主意。

于 2011-07-12T19:52:47.780 回答
2

自从我对 optparse 做任何事情以来已经有一段时间了,但我简要浏览了文档和一个旧程序。

-f/-s,-e/-d 是强制选项,但 -f&-s 不能一起使用,并且与 -e&-d 选项相同 - 不能一起使用。我怎样才能将检查放在适当的位置?

对于互斥性,您必须自己进行检查,例如:

parser.add_option("-e", help="e desc", dest="e_opt", action="store_true")
parser.add_option("-d", help="d desc", dest="d_opt", action="store_true")
(opts, args) = parser.parse_args()
if (parser.has_option("-e") and parser.has_option("-d")):
    print "Error!  Found both d and e options.  You can't do that!"
    sys.exit(1)

由于此处的示例选项是布尔值,您可以将上面的 if 行替换为:

if (opts.e_opt and opts.d_opt):

有关更多信息,请参阅optparse 如何处理错误部分。

我如何使用 -w 选项(使用时)或 w/oa 值?

我从来没有想出一个方法来拥有一个 optparse 选项,它的值是可选的。AFAIK,您必须将选项设置为具有值或不具有值。我最接近的是为必须具有值的选项指定默认值。然后不必在命令行上指定该条目。示例代码:

parser.add_option("-w", help="warning", dest="warn", default=0)

附带一个(希望有帮助的)建议:

如果您看过文档,您确实看到了关于“强制选项”是如何矛盾的部分,对吧?;-p 除了幽默,您可能需要考虑重新设计界面,以便:

  • 未使用“选项”输入所需信息。
  • 只有一个参数(或一组参数)输入可能互斥的数据。换句话说,用“-e on”或“-e off”代替“-e”或“-d”。如果您想要“-v”表示详细,“-q”表示安静/详细关闭,您可以将值存储到一个变量中:
parser.add_option("-v", help="verbose on", dest="verbose", action="store_true")
parser.add_option("-q", help="verbose off", dest="verbose", action="store_false")

这个特定的例子是从处理布尔(标志)选项部分借用的(稍微扩展)。对于这样的事情,您可能还想查看“分组选项”部分;这个功能我没用过,就不多说了。

于 2011-07-12T21:22:36.560 回答