先定义一个简单的 Python 脚本 greeter.py
。
# greeter.py
import sys
import json
param = sys.argv[1]
user_info = json.loads(param)
print(f'Welcome, {user_info["Name"]}, your user id is {user_info["ID"]}.')
在命令行执行 Python 脚本,非常简单:
python greeter.py
将 JSON 参数传入脚本 greeter.py
,
(base) chloe@ChloedeMacBook-Pro ~ % python greeter.py {"Name":"xishuo","ID":12333}
报错了
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
正确方法应该使用单引号将 JSON 参数保护起来:
(base) chloe@ChloedeMacBook-Pro ~ % python greeter.py '{"Name":"xishuo", "ID":12333}'
Welcome, xishuo, your user id is 12333.
如果不想用单引号,非要用双引号呢,那就要用 \
把双引号保护起来。
(base) chloe@ChloedeMacBook-Pro ~ % python greeter.py "{\"Name\":\"xishuo\", \"ID\":12333}"
Welcome, xishuo, your user id is 12333.
那可不可以用双引号保护单引号呢?实践一下:
(base) chloe@ChloedeMacBook-Pro ~ % python greeter.py "{'Name':'xishuo', 'ID':12333}"
Traceback (most recent call last):
File "/Users/chloe/PycharmProjects/pythonProject1/greeter.py", line 7, in <module>
user_info = json.loads(param)
File "/Users/chloe/opt/anaconda3/lib/python3.9/json/__init__.py", line 346, in loads
return _default_decoder.decode(s)
File "/Users/chloe/opt/anaconda3/lib/python3.9/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/Users/chloe/opt/anaconda3/lib/python3.9/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)
报错了,依然无法解析,为什么呢,让我们看下 JSON 官网的定义:
In JSON, they take on these forms:
...
...
A value can be a string in double quotes, or a number, or true or false or null, or an object or an array.
JSON 中的字符串必须用双引号包裹,所以在传入 JSON 参数时,要么用单引号将参数保护起来,要么用双引号保护、而参数内的双引号用 \
保护。
听起来很复杂,但当使用 json.dumps()
时,可以不用担心这个问题,它可以将字典转换成标准 JSON 格式:
>>> import json
>>> user_dict = {'Name': 'xishuo', 'ID': 12333}
>>> user_json = json.dumps(user_dict)
>>> print(user_json)
{"Name": "xishuo", "ID": 12333}
需注意的是,方法 json.dumps()
与 json.dump()
是有区别的。 json.dumps()
是将对象序列化为 JSON 格式的字符串;而 json.dump()
则序列化为 JSON 流形式的 fp ,一个类文件的对象,可以存储到文件中。同理 json.loads()
和 json.load()
。
最后,需要在程序中执行 greeter.py
脚本并传递 JSON 参数,可以这么做:
>>> user_dict = {'Name': 'xishuo', 'ID': 12333}
>>> user_json = json.dumps(user_dict)
>>> cmd = f'python greeter.py \'{user_json}\''
>>> print(cmd)
python greeter.py '{"Name": "xishuo", "ID": 12333}'
标签:Python,py,json,JSON,user,命令行,greeter,xishuo
From: https://www.cnblogs.com/xishuo/p/16726082.html