命令行传递 JSON 参数执行 Python 脚本

先定义一个简单的 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}'

posted @ 2022-09-24 17:33  希说  阅读(2629)  评论(0)    收藏  举报