我期待这种格式的参数
filname.py -input="a","b","c"
目前,我正在通过此代码解析命令行参数
dict(item.split("=") for item in sys.argv[1].split(" "))
有没有更好的方法来读取命令行参数。我尝试使用OptionParser但OptionParser要求键值对用空格分隔。
答案 0 :(得分:1)
以下是通过argparse
累积列表的具体示例,我在上面的评论中提到过。
>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> args = parser.parse_args("--foo a --foo b --foo c".split())
>>> print(args.foo)
['a', 'b', 'c']
这不太理想,因为这需要为要添加到其列表中的每个项目提供参数名称--foo
。
另一种方法是用逗号读取字符串并拆分它们:
>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> args = parser.parse_args("--foo a,b,c".split())
>>> args.foo
'a,b,c'
>>> args.foo.split(',')
['a', 'b', 'c']
我想这可能是一个XY问题。你试图通过参数这样的参数来完成什么?
在收到进一步的信息(OP的评论)之后,键值读数似乎至关重要。
Tornado项目有一个自定义选项解析模块tornado.options
,它假定在命令行中给出的值是你想要的键值对。
我会不建议您将Tornado导入到您的项目中,以使其正常运行。但是,您可以阅读我链接的文件中的OptionParser
对象定义,了解如何实现此类功能。使用这个新的参数解析器模拟argparse
:
>>> from tornado.options import OptionParser
>>> parser = OptionParser()
>>> parser.define('foo', multiple=True)
>>> parser.parse_command_line('throwaway --foo="a","b","c"'.split())
>>> parser.foo
['"a"', '"b"', '"c"']
请注意,parse_command_line
在开头需要一个额外的一次性参数。这是因为如果您不提供值,它将使用sys.args
并跳过第一个参数(通常是正在执行的命令的名称)。在您自己的解析器中,您可以重写this line从0
开始而不是1
,并避免这种必要性。
方便地,Tornado的OptionParser
确实包含通过multiple=True
define
参数指定列表的功能。你仍然需要去掉它们无关的引号的结果值,但这已经足够了。