问题描述
我试图在命令提示符下将JSON作为参数传递给python脚本。如果JSON中的元素的值没有空格,则可以使用,但是如果有空格,则不能使用。
这是脚本
import json,sys,traceback
if(len(sys.argv)>1):
print(sys.argv[1])
jsonInput = json.loads(sys.argv[1]);
print(jsonInput['name'])
print(jsonInput['kingdom'])
print(jsonInput['slogan'])
在JSON下面作为power Shell中的参数传递。我的值中有空格,例如乔恩·雪诺
python C:\Users\user1\Desktop\myTest.py '{\"name\":\"Jon SNow\",\"kingdom\":\"Winterfell\",\"slogan\":\"King in the north\"}'
输出:
python : Traceback (most recent call last):
At line:1 char:1
+ python C:\Users\kiran.patil\Desktop\myTest.py '{\"name\":\"Jon SNow\" ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (Traceback (most recent call last)::String) [],remoteexception
+ FullyQualifiedErrorId : NativeCommandError
File "C:\Users\User\Desktop\myTest.py",line 5,in <module>
jsonInput = json.loads(sys.argv[1]);
File "C:\Program Files\python38\lib\json\__init__.py",line 357,in loads
return _default_decoder.decode(s)
File "C:\Program Files\python38\lib\json\decoder.py",line 337,in decode
obj,end = self.raw_decode(s,idx=_w(s,0).end())
File "C:\Program Files\python38\lib\json\decoder.py",line 353,in raw_decode
obj,end = self.scan_once(s,idx)
json.decoder.JSONDecodeError: Unterminated string starting at: line 1 column 9 (char 8)
请任何建议对其进行修复。
解决方法
如果使用\"
,则表示引号也是双引号。在Windows上,封闭的单引号不起作用,因此2个选项是
# Linux + Windows
python script.py "{\"name\":\"Jon Snow\",\"kingdom\":\"Winterfell\",\"slogan\":\"King in theNorth\"}"
# Linux only
python script.py '{"name":"Jon Snow","kingdom":"Winterfell","slogan":"King in theNorth"}'
Powershell保护壳
python script.py '{""name"":""Jon Snow"",""kingdom"":""Winterfell"",""slogan"":""King in theNorth""}'
,
在 PowerShell 中:
-
您尝试进行的 事实上没有任何根本错误 ,以逃避嵌入
"
字符为{{ 1}}调用外部程序(例如Python),尽管包含在单引号的字符串中({{1 }}):-
由于 Windows PowerShell 中的其他错误(除了下面讨论的基本错误),此问题已在 PowerShell [核心]中修复。 ] v6 + ,带有
\"
的字符串仅在包含至少个空格字符的情况下转义。 -
换句话说:在 PowerShell [Core] v6 + 中,您的命令可以按原样工作 ;在 Windows PowerShell 中,仅当您的字符串包含至少一个空格字符 时才有效。
-
因为在这种特定情况下(仅!)
'...'
和\"
是可互换的,并且\"
的使用也适用于空格-azro's helpful answer中所示,在Windows PowerShell中,使用""
进行转义的字符串较少> 是更可靠的选择。 Windows上的 caveat 是大多数(但不是全部)CLI将""
识别为转义的""
字符,而那些没有的CLI识别""
。
-
"
-
有 应该出了问题,但是,因为您不必逃脱
\"
个字符。在# OK even in Windows PowerShell,due to the string containing spaces. # "" instead of \" works too and avoids the need for spaces in Windows PowerShell # - but neither should be necessary (see below). python myTest.py '{\"name\": \"Jon Snow\",\"kingdom\": \"Winterfell\",\"slogan\": \"King in the North\"}'
分隔的字符串文字中,它是一个 verbatim string literal in PowerShell。-
实际上,如果您调用 PowerShell-native 命令,您不需要;例如:
"
可以正常工作。 -
由于一个长期存在的错误,不幸的是,您必须在调用外部程序时执行此操作-尚未解决的某些问题,目的是不破坏向后兼容性-请参阅this answer了解背景信息和将来可能的解决方法。
-