[英]Passing Python JSON argument with whitespace
我試圖在命令提示符下將 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'])
在 Power Shell 中將 JSON 作為參數傳遞到下面。 我在值中有空格,例如 Jon Snow
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 中:
實際上,您嘗試將嵌入的"
字符轉義為\\"
以調用外部程序(例如 Python)從根本上沒有任何錯誤,盡管它們被包含在單引號字符串( '...'
)中:
由於Windows PowerShell 中的一個額外錯誤(除了下面討論的基本錯誤之外),該錯誤已在PowerShell [Core] v6+ 中修復,帶有\\"
轉義的字符串僅在包含至少一個空格字符時才有效。
換句話說:在PowerShell [Core] v6+ 中,您的命令將按原樣運行; 在Windows PowerShell 中,它只有在您的字符串至少包含一個空格字符時才有效。
因為在這個特定背景下(僅!) \\"
和""
是可以互換和使用""
還與在Windows PowerShell中節省空間更少的字符串, ""
-escaping,如圖azro的有用的答案,是更強大的選擇;需要注意的是,Windows 上的大多數但並非所有CLI都將""
識別為轉義的"
char.",而那些不識別\\"
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\"}'
但是,應該有問題,因為您不必在'...'
分隔的字符串文字中轉義"
字符。這是PowerShell 中的逐字字符串文字。
其實,你並不需要,如果你調用PowerShell的本地命令去做; 例如:
ConvertFrom-Json '{ "foo": "bar" }'
工作得很好。
由於長期存在的錯誤,您在調用外部程序時確實必須這樣做,不幸的是- 尚未修復以免破壞向后兼容性 - 有關背景信息和可能的未來修復,請參閱此答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.