有没有办法在 Python 上使用 argparse 添加一个参数来抑制对其他参数的需求?

Is there a way to add a parameter that supress the need of other parameters using argparse on Python?

我在 python 上使用 Argparse 在命令行上执行脚本。我的脚本有这个:

parser = argparse.ArgumentParser(prog = 'manageAdam')
parser.add_argument("-s", action='store_true', default=False, help='Shows configuration file')

parser.add_argument("d", type=str, help="device")
parser.add_argument("o", type=str, help="operation")
parser.add_argument("-v", "--value", type=int, nargs='*', help="value or list to send in the operation")

我正在寻找如果我调用 manageAdam -s 它会工作并且不要求位置参数,比如 -h,可以在没有定义任何其他位置参数的情况下调用它。可能吗?

不,没有这样的方法。

您可以将所有参数设为可选并将默认值设置为 None 然后执行检查以确保所有参数都不 None 否则如果 manageAdam 则提高 argparse.ArgumentError提供了对其他参数的跳过检查。

没有执行此操作的内置方法。您 可能 可以通过编写一些自定义 Action 类 来跟踪解析器的状态,但我相信它会变得非常混乱并且越野车。

我认为最好的办法就是简单地提高您的 UI。 -s 不是 一个选项。这是一个单独的命令,可以完全改变脚本的执行方式。在这种情况下,您应该使用允许引入子命令的 subparsers 功能。这是一个比您想象的更好的界面,并且被许多其他工具使用(例如 Git/mercurial)。

在这种情况下,您将有一个 config 命令来处理配置,还有一个 run(或您希望如何称呼它)命令在设备上执行操作:

subparsers = parser.add_subparsers(dest='command')
parser_config = subparsers.add_parser('config', help='Configuration')
parser_run = subparsers.add_parser('run', help='Execute operation on device')

parser_run.add_argument('d',  type=str, ...)
parser_run.add_argument('o',  type=str, ...)
parser_run.add_argument('-v', type=int, nargs='*', ...)

# later:

args = parser.parse_args()
if args.command == 'config':
    print('Configuration')
else:
    print('Run operation')

从命令行用作:

$ manageAdam config
# or
$ manageAdam run <device> <operation> <values...>