我有一个带有父解析器的小脚本,它接受create
或run
参数。
在前一种情况下,我希望从用户那里获得更多信息,但我想要零碎地得到它,这样他们就不必在一开始就输入一个15个参数的字符串。我可以创建我的下一个解析器但是当我从raw_input()
传递一个字符串时,每个字符都被视为一个参数,这让我相信我做错了:
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(title='subcommands', help='additional help')
create_parser = subparsers.add_parser('create')
create_parser.set_defaults(func=create)
run_parser = subparsers.add_parser('run')
run_parser.set_defaults(func=run)
def create():
author_parse = argparse.ArgumentParser()
author_parse.add_argument('name', type=str, nargs=2)
auth_args = auth_parse.parse_args(raw_input("Provide your first and last name:"))
# >> myprogram run
# >> Provide your first and last name:
# >> john smith
# >> error: unrecognized arguments: h n S m i t h
编辑:对于那些想知道为什么我不只是使用raw_input()
的人,因为我将经历几轮从用户那里获得更多信息,并希望利用argparse强大的能力来智能地管理输入而不是自己写这一切。例如,对于“你的姓名是什么?”,整数不是一个可接受的回应。
raw_input()
是我在运行时期间从用户获得响应的唯一方法,这是我调用它的唯一原因。
答案 0 :(得分:3)
argparse.parse_args()
采用可迭代的字符串;你正在传递一个字符串。尝试
def create():
author_parse = argparse.ArgumentParser()
author_parse.add_argument('name', type=str, nargs=2)
name = raw_input("Provide your first and last name: ")
auth_args = auth_parse.parse_args(name.split())
字符串本身是可迭代的,被视为字符串中字符的列表。也就是说,
auth_parse.parse_args("John Smith")
产生与
相同的结果auth_parse.parse_args(["J", "o", "h", "n", " ", "S", "m", "i", "t", "h"])