将包含json w / spaces的字符串拆分为参数

时间:2017-08-25 14:02:09

标签: python json argparse python-cmd

我正在使用cmd2实现命令shell,我想设置一些允许用户以json语法键入对象的命令。我认为这对argparse来说很容易,但我会陷入困境,如何解析并将字符串呈现给argparse。我也愿意使用另一个模块。

我一直在尝试使用正则表达式来提取json,但我没有看到一个简单的方法。

首先,这是一个使用命令行实用程序的示例:

import argparse
import json
import re

if __name__ == '__main__':

    parser = argparse.ArgumentParser()
    parser.add_argument('-f', '--filter', type=json.loads)
    parser.add_argument('-n', '--name', type=str)

    args = parser.parse_args()
    print(args)

输出:

python testparse.py -n device -f '{"comment": "foo space bar"}'
Namespace(filter={u'comment': u'foo space bar'}, name='device')

然后使用cmd2:

import argparse
from cmd2 import Cmd
import json

class App(Cmd):
# customized attributes and methods here

    def do_example(self, arg):
        print(arg.parsed.dump() + '\n')
        argString = arg.parsed.args

        parser = argparse.ArgumentParser()
        parser.add_argument('-f', '--filter', type=json.loads)
        parser.add_argument('-n', '--name', type=str)

        # split works when there are no spaces
        args = parser.parse_args(argString.split())
        print(args)


if __name__ == '__main__':

    app = App()

    # split() works with no spaces
    app.onecmd('example -n devices -f {"comment":"foobar"}')
    # it does not work with spaces in your json data, both
    # formats below have similar failures
    app.onecmd('example -n devices -f {"comment":"foo space bar"}')
    # app.onecmd("""example -n devices -f '{"comment":"foo space bar"}'""")

输出:

['example', '-n devices -f {"comment":"foobar"}']
- args: '-n devices -f {"comment":"foobar"}'
- command: 'example'
- raw: 'example -n devices -f {"comment":"foobar"}'
- statement: ['example', '-n devices -f {"comment":"foobar"}']
  - args: '-n devices -f {"comment":"foobar"}'
  - command: 'example'

Namespace(filter={u'comment': u'foobar'}, name='devices')
['example', '-n devices -f {"comment":"foo space bar"}']
- args: '-n devices -f {"comment":"foo space bar"}'
- command: 'example'
- raw: 'example -n devices -f {"comment":"foo space bar"}'
- statement: ['example', '-n devices -f {"comment":"foo space bar"}']
  - args: '-n devices -f {"comment":"foo space bar"}'
  - command: 'example'

usage: testparse2.py [-h] [-f FILTER] [-n NAME]
testparse2.py: error: argument -f/--filter: invalid loads value: '{"comment":"foo'

0 个答案:

没有答案