【发布时间】:2018-10-27 00:43:15
【问题描述】:
一个示例脚本:
import argparse
def main(args=None):
parser = argparse.ArgumentParser(prog='PROG')
subparsers = parser.add_subparsers(help='sub-command help')
parser_a = subparsers.add_parser('a', help='a help')
parser_a.add_argument('--foo', choices='ABC', help='foo help')
parser_b = subparsers.add_parser('b', help='b help')
parser_b.add_argument('--baz', choices='XYZ', help='baz help')
args = parser.parse_args(args)
if __name__ == '__main__':
main()
使用 Python2:
$ python2 test.py
usage: PROG [-h] {a,b} ...
PROG: error: too few arguments
这就是我想要的,当命令行中缺少子命令时,脚本会提示缺少参数的错误,并提示我一个简短的使用信息。
但是对于 Python3:
$ python3 test.py
# nothing happens
它不会提示任何有关使用的帮助并静默退出(尽管我可以使用python3 test.py -h 来获取帮助消息)。如何更改代码以使其像 python2 方式一样工作并使其与 Python2 和 Python3 兼容?
所以在 Python2 中,它可以检测到缺少子命令错误并提前退出,但对于 Python3 则不行。对我来说问题是我在parser.parse_args(args) 之后有很多代码依赖于解析的 args,它适用于 python2,我在将它迁移到 Python3 时发现了这个问题,如果在命令行中没有指定子命令,这些代码会引发错误,我需要一种方法来检测命令行中指定了子命令,并且不应该破坏在python2下运行的脚本。
对我来说一个可能的解决方案是检查解析的“args”是否为空,但这对我不起作用,因为我的脚本有一些全局选项,例如:
parser.add_argument('--go', choices='123', help='global option help')
【问题讨论】:
-
尝试将程序重命名为
test.py以外的其他名称,以免以后头疼。我在 3.6.5 和 2.7.15 上都看到了您的 Python 3 结果。 -
我认为脚本名称与结果无关,我在 python3.6.6 和 python2.7.15 下的测试显示的结果与我在问题中描述的不同。
-
你是对的,它不会,但是隐藏标准库包的名称是不明智的。我只是将我自己的结果作为数据点报告。
标签: python python-3.x argparse