单击python如何从命令行读取类似json的参数

单击python如何从命令行读取类似json的参数,python,shell,command-line-interface,python-click,Python,Shell,Command Line Interface,Python Click,我的问题是,我想做一些类似的事情。范例 cli foo:='["http","pie"]' 我在代码中所做的是 @click.command() @click.argument('options', nargs=1) def dummy(options): key, value = options.split(':=') click.echo({key: json.loads(value)}) 为了进行测试,我在shell中尝试了以下命令: $ibc伪星:=“{”foo:“b

我的问题是,我想做一些类似的事情。范例

cli foo:='["http","pie"]'
我在代码中所做的是

@click.command()
@click.argument('options', nargs=1)
def dummy(options):
    key, value = options.split(':=')
    click.echo({key: json.loads(value)})
为了进行测试,我在shell中尝试了以下命令:

$ibc伪星:=“{”foo:“bar”}”
$ibc虚拟星:={“foo”:“bar”}
(我有一台Windows10机器)

我得到一个
json.JSONDecodeError
。有人能帮我调试这个问题吗

堆栈跟踪如下所示:

Traceback (most recent call last):
File "C:\Users\rolla\.virtualenvs\infoblox_client-tZbB1-ed\Scripts\ibc-script.py", line 11, in <module>
load_entry_point('infoblox-client', 'console_scripts', 'ibc')()
File "c:\users\rolla\.virtualenvs\infoblox_client-tzbb1-ed\lib\site-packages\click\core.py", line 764, in __call__
return self.main(*args, **kwargs)
File "c:\users\rolla\.virtualenvs\infoblox_client-tzbb1-ed\lib\site-packages\click\core.py", line 717, in main
rv = self.invoke(ctx)
File "c:\users\rolla\.virtualenvs\infoblox_client-tzbb1-ed\lib\site-packages\click\core.py", line 1137, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "c:\users\rolla\.virtualenvs\infoblox_client-tzbb1-ed\lib\site-packages\click\core.py", line 956, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "c:\users\rolla\.virtualenvs\infoblox_client-tzbb1-ed\lib\site-packages\click\core.py", line 555, in invoke
return callback(*args, **kwargs)
File "d:\projets\python\infoblox_client\infoblox\scripts\__init__.py", line 31, in dummy
click.echo({key: json.loads(value)})
File "C:\Users\rolla\AppData\Local\Programs\Python\Python37-32\Lib\json\__init__.py", line 348, in loads
return _default_decoder.decode(s)
File "C:\Users\rolla\AppData\Local\Programs\Python\Python37-32\Lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Users\rolla\AppData\Local\Programs\Python\Python37-32\Lib\json\decoder.py", line 353, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
回溯(最近一次呼叫最后一次):
文件“C:\Users\rolla\.virtualenvs\infoblox\u client-tZbB1-ed\Scripts\ibc script.py”,第11行,在
加载入口点('infoblox-client','console脚本','ibc')()
文件“c:\users\rolla\.virtualenvs\infoblox\u client-tzbb1-ed\lib\site packages\click\core.py”,第764行,在调用中__
返回self.main(*args,**kwargs)
文件“c:\users\rolla\.virtualenvs\infoblox\u client-tzbb1-ed\lib\site packages\click\core.py”,第717行,位于主目录中
rv=自调用(ctx)
文件“c:\users\rolla\.virtualenvs\infoblox\u client-tzbb1-ed\lib\site packages\click\core.py”,第1137行,在invoke中
返回进程结果(sub_ctx.command.invoke(sub_ctx))
文件“c:\users\rolla\.virtualenvs\infoblox\u client-tzbb1-ed\lib\site packages\click\core.py”,调用中第956行
返回ctx.invoke(self.callback,**ctx.params)
文件“c:\users\rolla\.virtualenvs\infoblox\u client-tzbb1-ed\lib\site packages\click\core.py”,调用中第555行
返回回调(*args,**kwargs)
文件“d:\projets\python\infoblox\u client\infoblox\scripts\\uuuuuu init\uuuuuu.py”,第31行,虚拟格式
click.echo({key:json.loads(value)})
文件“C:\Users\rolla\AppData\Local\Programs\Python\Python37-32\Lib\json\\ u_init\u_.py”,第348行,在loads中
返回\u默认\u解码器。解码
文件“C:\Users\rolla\AppData\Local\Programs\Python\Python37-32\Lib\json\decoder.py”,第337行,在decode中
obj,end=self.raw\u decode(s,idx=\u w(s,0.end())
文件“C:\Users\rolla\AppData\Local\Programs\Python\Python37-32\Lib\json\decoder.py”,第353行,原始解码
obj,end=self.scan_一次(s,idx)
json.decoder.JSONDecodeError:应为包含在双引号中的属性名:第1行第2列(字符1)

这可能是因为字符串没有正确转义。例如,当您输入
“{”foo:“bar”}”
时,Python只会看到一个字符串
“{”
后跟不清楚的字母
foo
,然后是另一个字符串
”:“
等等。通常在Python中,如果您想在字符串中包含引号,您可以将单引号放在双引号中(如
“他对我说‘你好’。”
),将双引号放在单引号中(如
“他对我说“你好”
),或用反斜杠将引号转义(如
“他对我说“你好”
)。在这种情况下,您必须使用最后一个选项,因为它在两个位置都需要双引号:


$ibc dummy star:=“{\“foo\”:“bar\”}”

听起来问题可能出在您提供的输入上-您也可以发布您的输入吗?我更新了我的帖子@UnsolvedCypher@UnsolvedCypher,非常感谢@UnsolvedCypher。我检查过,在linux下我没有这个问题。Argh这个窗口^^