我正在努力编写一个简单的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()
答案 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
的子分析器和默认值的方法。