如何在运行时使用argparse来有条件地获得进一步的输入?

时间:2015-09-18 19:06:39

标签: python argparse

我有一个带有父解析器的小脚本,它接受createrun参数。

在前一种情况下,我希望从用户那里获得更多信息,但我想要零碎地得到它,这样他们就不必在一开始就输入一个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()是我在运行时期间从用户获得响应的唯一方法,这是我调用它的唯一原因。

1 个答案:

答案 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"])