我正在创建一个编写其他脚本的脚本,在从终端调用脚本时,参数作为JSON传递。
需要编写的脚本包含一个字典。 该字典中的一个关键值是变量名称(不是字符串)调用策略。
我的问题看起来像这样。
d = json.loads(sys.argv[2])
# d should looks like that
d = {
"stopLossValue": 5,
"strategy": strategy,
"strategyTitle": "week5"
}
dic = """
parameterDict = {}
""".format(json.dumps(d, sort_keys=True, indent=4))
如果我将策略键值设置为字符串,则运行该脚本会返回一个消失的错误。
错误:
Traceback (most recent call last):
File "updateCandleStrategy.py", line 11, in <module>
d = json.loads(sys.argv[2])
File "/usr/lib/python3.4/json/__init__.py", line 318, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.4/json/decoder.py", line 343, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.4/json/decoder.py", line 361, in raw_decode
raise ValueError(errmsg("Expecting value", s, err.value)) from None
ValueError: Expecting value: line 1 column 506 (char 505)
有没有一种简单的方法来实现我的目标?
由于
答案 0 :(得分:1)
从命令行传递json
字符串时,很有可能其中一个引号/ escape char被底层shell解释。
因此,这不是传递json
字符串的可行/可靠方法。传递包含json数据的文件并读取它:
with open(sys.argv[2]) as f:
d = json.load(f)
来自Windows控制台的示例,只打印第二个参数:
S:\python>foo.py ff "d = {"s":12,"d":15}"
d = {s:12,d:15}
报价已被删除。需要加倍他们。
在Linux终端上,将您的参数包装成单引号可以解决大多数情况,直到您偶然发现包含单引号的值...
为什么不使用getopt
或argparse
来构建/解析正确的命令行,而不是传递字典?