Using argparse to parse arguments of form “arg= val”

后端 未结 4 1429
时光说笑
时光说笑 2020-12-14 18:20

I want to use argparse to parse command lines of form \"arg=val\" For example, the usage would be:

script.py conf_dir=/tmp/good_conf

To ach

相关标签:
4条回答
  • 2020-12-14 18:49

    @chepner This is great. I improved this to support multiple args as well and store the result as dict:

    class StoreDict(argparse.Action):
        def __call__(self, parser, namespace, values, option_string=None):
            kv={}
            if not isinstance(values, (list,)):
                values=(values,)
            for value in values:
                n, v = value.split('=')
                kv[n]=v
            setattr(namespace, self.dest, kv)
    
    0 讨论(0)
  • 2020-12-14 18:56

    You need a custom action

    class StoreNameValuePair(argparse.Action):
        def __call__(self, parser, namespace, values, option_string=None):
            n, v = values.split('=')
            setattr(namespace, n, v)
    
    args = parser.add_argument("conf_dir", action=StoreNameValuePair)
    
    0 讨论(0)
  • 2020-12-14 19:08

    The usual way to put name value pairs on the command line is with options. I.e. you would use

    python script.py --confdir=/tmp/good_conf
    

    argparse can certainly handle that case. See the docs at:

    http://docs.python.org/library/argparse.html#option-value-syntax

    0 讨论(0)
  • 2020-12-14 19:10

    As per the documentation, argparse doesn't natively let you have unprefixed options like that. If you omit the leading -, it assumes you are describing a positional argument and expects it to be provided as:

    python script.py /tmp/good_conf
    

    If you want it to be optional, it needs to be correctly marked as a flag by calling it --conf_dir, and invoking the script like:

    python script.py --conf_dir=/tmp/good_conf
    

    However, to accept name-value pairs, you can implement a custom action. In combination with nargs, such an action could accept an arbitrary number of name-value pairs and store them on the argument parsing result object.

    0 讨论(0)
提交回复
热议问题