нажмите Python, как я могу прочитать JSON как аргумент из командной строки - PullRequest
0 голосов
/ 02 декабря 2018

моя проблема в том, что я хочу выполнить что-то похожее на то, что делает httpie .Пример

cli foo:='["http","pie"]'

Что я сделал в своем коде, это

@click.command()
@click.argument('options', nargs=1)
def dummy(options):
    key, value = options.split(':=')
    click.echo({key: json.loads(value)})

Для теста я попытался выполнить следующие команды в своей оболочке:

$ ibc dummy star:="{"foo":"bar"}"и $ ibc dummy star:={"foo":"bar"} (у меня машина с Windows 10)

Я получаю 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)

С уважением.

1 Ответ

0 голосов
/ 07 декабря 2018

Это вероятно потому, что ваши строки не экранированы должным образом.Например, когда вы вводите "{"foo":"bar"}", Python просто видит строку "{", за которой следуют непонятные буквы foo, затем еще одну строку ":" и так далее.Обычно в Python, если вы хотите включить кавычки в строку, вы можете поместить одинарные кавычки в двойные кавычки (например, "He said 'hello' to me"), двойные кавычки в одинарные кавычки (например, 'He said "hello" to me') или экранировать кавычки обратной косой чертой.(как "he said \"hello\" to me").В этом случае вы должны использовать последний вариант, так как он ожидает двойные кавычки в обоих местах:

$ibc dummy star:="{\"foo\":\"bar\"}"

...