有没有办法在Python上使用argparse添加一个可以满足其他参数需求的参数?

时间:2016-08-17 08:44:56

标签: python argparse

我在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,可以在没有任何其他定义的位置参数的情况下调用它。有可能吗?

2 个答案:

答案 0 :(得分:1)

没有内置方法可以做到这一点。 可能能够通过编写一些自定义Action类来实现某些功能,这些类可以跟踪解析器的状态,但我相信它会变得非常混乱和错误。

我认为最好的办法是简单地改善你的用户界面。 -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...>

答案 1 :(得分:0)

不,没有这样的方式。

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