【问题标题】:Python argparse a list inputPython argparse 列表输入
【发布时间】:2015-04-28 15:01:04
【问题描述】:

下面的代码接受mode 的命令行参数,例如-m fizz 和-m fizz bazz。正如预期的那样,这会将参数作为['fizz', 'bazz'] 传递给主函数(对于上面的第二个示例)。使用空格传递命令行参数似乎对用户不友好,所以我希望 argparse 接受逗号分隔的列表,例如-m fizz,bazz 或 -m ['fizz','bazz']。如何修改下面的代码来做到这一点?谢谢!

import agrparse
...
parser.add_argument("-m", "--mode", nargs="*",
                    default=["fizz", "bazz", "razmataz"],
                    help="Comma separated list of mode(s) to use, e.g."
                    "[\"fizz\", \"bazz\"]")
main(parser.parse_args())

【问题讨论】:

    标签: python command-line-arguments argparse


    【解决方案1】:

    使用打印sys.argv 的简单脚本我得到

    1014:~/mypy$ python echoargv.py -m ['fizz','bazz']
    ['echoargv.py', '-m', '[fizz,bazz]']
    1014:~/mypy$ python echoargv.py -m fizz,bazz
    ['echoargv.py', '-m', 'fizz,bazz']
    1015:~/mypy$ python echoargv.py -m fizz, bazz
    ['echoargv.py', '-m', 'fizz,', 'bazz']
    1016:~/mypy$ python echoargv.py -m ['fizz', 'bazz']
    ['echoargv.py', '-m', '[fizz,', 'bazz]']
    1016:~/mypy$ python echoargv.py -m fizz bazz
    ['echoargv.py', '-m', 'fizz', 'bazz']
    

    这就是您的parser 必须使用的。

    最后一种情况,每个字符串都是sys.argv 中的一个单独项目,这是最简单的,也是您的nargs='*' 旨在处理的。它应该返回Namespace(mode = ['fizz','bazz'])

    您有 2 个选项。您可以在将sys.argv 传递给parser 之前对其进行清理。或者你可以在解析后查看args.mode属性,并根据需要进行清理。

    例如,'fizz,bazz' 可以在 , 上拆分。 '[fizz,bazz]' 需要先剥离 []。其他需要删除额外的,'。

    您可以在自定义 Action 类中进行这种拆分和清理,但这不会为您节省任何工作。


    自定义type 也可用于拆分字符串

    In [170]: def foolist(astring):
        alist=astring.strip('[').strip(']').split(',')
        alist = [a.strip() for a in alist if len(a)]
        return alist
    
    In [171]: p=argparse.ArgumentParser()
    
    In [172]: p.add_argument('-m',type=foolist,nargs='*')
    Out[172]: _StoreAction(option_strings=['-m'], dest='m',...
    
    In [173]: p.parse_args(['-m','one','two'])
    Out[173]: Namespace(m=[['one'], ['two']])
    
    In [174]: p.parse_args(['-m','one,two'])
    Out[174]: Namespace(m=[['one', 'two']])
    
    In [175]: p.parse_args(['-m','[one, two]'])
    Out[175]: Namespace(m=[['one', 'two']])
    

    列表是嵌套的。可以使用默认的nargs,但它不允许常规的空格分隔列表。但是有一些标准的 Python 方法可以展平嵌套列表。

    【讨论】:

    • 谢谢。是的,这可以在解析后通过调用args.mode[0].split(',') 来处理,但我正在寻找一种解决方案,其中可以指定 argparse 来自行处理逗号分隔的输入。
    • 然后您必须创建一个可以进行拆分的自定义操作。没有任何预定义的花里胡哨的功能可以为您做到这一点。查看文档中的示例,为您想要的参数打印values,然后处理这些。
    • 我添加了一个type 示例
    猜你喜欢
    • 2014-11-03
    • 1970-01-01
    • 2016-12-31
    • 2017-12-04
    • 2015-09-17
    • 1970-01-01
    • 2019-11-28
    • 2012-11-05
    • 2018-12-25
    相关资源
    最近更新 更多