Python:参数解析器 - 允许不允许使用多个参数,不需要“ - ”

时间:2018-04-06 11:34:14

标签: python argparse

我正在努力编写一个简单的python脚本(伪git),这将允许我使用命令从命令行/ shell调用它:

$ python script.py init

我在网上找到了一些解决方案,这使我能够这样做,但是没有什么问题。我想要“添加”函数来接受其他参数(一般来说,字符串代表文件的名称)。

我找到了一种解决方法,但看起来并不好看。有没有办法重构代码,所以“添加”也会接受其他参数,让我以后访问它们?重要的是:我不希望它们添加“ - ”,我宁愿通过简单地在两个参数之间添加空格来将它们分开。

我在add_argument中找到了“nargs ='+'选项,但我不知道如何重定向参数以调用正确的函数。

这是我到目前为止编写的代码:

import argparse
import sys

def init():
    print("init method call")

def add():
    if(len(sys.argv)>2):
        print("valid add method call")
    else:
        print("invalid call")

def commit():
    print("commit method call") 

def status():
    print("status method call") 

def test():
    print("test method call")   

FUNCTION_MAP = {'init' : init,
                'status' : status,
                'commit': commit}

if __name__ == '__main__':
    if(len(sys.argv)>1 and sys.argv[1] == "add"):
        add()
    else:           
        parser = argparse.ArgumentParser()
        parser.add_argument('command', choices=FUNCTION_MAP.keys())
        args = parser.parse_args()
        func = FUNCTION_MAP[args.command]
        func()

1 个答案:

答案 0 :(得分:0)

这里有两个选项 - 采取额外的位置,并使用或忽略这些值。或者使用subparsers。

import argparse

def add(args):
    print("add:", args)

def status(args):
    values = getattr(args,'values',None)
    if values and len(values)>0:
        # error message and method of your choice
        print('oops - got values', args)
    print("status method call")

FUNCTION_MAP = {'add' : add,
                'status' : status}

if __name__ == '__main__':

        parser = argparse.ArgumentParser()
        parser.add_argument('command', choices=FUNCTION_MAP.keys())
        parser.add_argument('values', nargs='*')
        args = parser.parse_args()
        func = FUNCTION_MAP[args.command]
        func(args)

        print('\nWIth subparsers')
        parser = argparse.ArgumentParser()
        sp = parser.add_subparsers(dest='command')
        spp = sp.add_parser('add')
        spp.add_argument('values', nargs='*')
        spp = sp.add_parser('status')
        args = parser.parse_args()
        func = FUNCTION_MAP[args.command]
        func(args)

样品运行

1906:~/mypy$ python3 stack49691897.py add 1 2 3
add: Namespace(command='add', values=['1', '2', '3'])

WIth subparsers
add: Namespace(command='add', values=['1', '2', '3'])
1907:~/mypy$ python3 stack49691897.py status
status method call

WIth subparsers
status method call
1907:~/mypy$ python3 stack49691897.py status 1 2 3
oops - got values Namespace(command='status', values=['1', '2', '3'])
status method call

WIth subparsers
usage: stack49691897.py [-h] {add,status} ...
stack49691897.py: error: unrecognized arguments: 1 2 3

argparse文档还演示了一种使用有效实现FUNCTION_MAP的子分析器和默认值的方法。