我正在使用 cmd2 实现一个命令外壳,并且我想设置一些命令,允许用户以 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'