Python中的命令行参数

时间:2017-02-12 19:42:18

标签: python

我期待这种格式的参数

filname.py -input="a","b","c"

目前,我正在通过此代码解析命令行参数

dict(item.split("=") for item in sys.argv[1].split(" "))

有没有更好的方法来读取命令行参数。我尝试使用OptionParser但OptionParser要求键值对用空格分隔。

1 个答案:

答案 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 line0开始而不是1,并避免这种必要性。

方便地,Tornado的OptionParser确实包含通过multiple=True define参数指定列表的功能。你仍然需要去掉它们无关的引号的结果值,但这已经足够了。