Windows环境下向Python程序命令行传递JSON字符串及接收异常排查
我来帮你解决Windows下命令行传递JSON给Python脚本的问题,还有你遇到的格式异常情况~
问题根源
核心原因是Windows命令行(CMD/PowerShell)和Linux的bash对引号的解析规则完全不同:Ubuntu的shell会完整保留你传入的JSON引号结构,但Windows下的命令行处理引号时会自动转义或截断,导致你拿到的json_in丢失了内部双引号,还多了一层不必要的单引号包裹。
正确传递JSON的两种方式
根据你使用的Windows命令行工具,分两种场景处理:
1. 用CMD传递JSON
CMD对双引号的处理很严格,需要把整个JSON用双引号包裹,同时内部的双引号要转义成\":
python your_script.py "{\"key1\":\"val1\", \"key2\":[\"val2\", \"val3\"], \"key3\":\"val4\"}"
这样CMD才会把完整的JSON字符串传递给Python,不会丢失内部引号。
2. 用PowerShell传递JSON
PowerShell的引号规则更灵活,有两种写法:
- 用单引号包裹整个JSON,内部双引号无需转义:
python your_script.py '{"key1":"val1", "key2":["val2", "val3"], "key3":"val4"}'
- 用双引号包裹时,内部双引号要写成两个连续双引号(
""):
python your_script.py "{""key1"":""val1"", ""key2"":[""val2"", ""val3""], ""key3"":""val4""}"
修复你的Python脚本
你的原脚本还有两个小问题:一是直接解构sys.argv容易因参数个数报错,二是没处理Windows下可能出现的外层多余引号。修改后的脚本如下:
import sys import json def main(): # 先检查是否传入了参数 if len(sys.argv) < 2: print("请传入JSON字符串作为命令行参数") sys.exit(1) json_in = sys.argv[1] # 清理外层可能的多余单/双引号(解决你遇到的"'{...}'"问题) json_in = json_in.strip('\'"') try: # 解析JSON parsed_data = json.loads(json_in) print("JSON解析成功:") print(parsed_data) except json.JSONDecodeError as e: print(f"JSON解析失败:{str(e)}") print("原始输入内容:", repr(json_in)) if __name__ == "__main__": main()
这个脚本会自动处理Windows下可能出现的引号异常,还加了参数检查和错误捕获,方便调试。
为什么Ubuntu没问题?
Ubuntu的bash等shell会正确识别双引号包裹的字符串,只要内部引号不冲突就会完整传递,所以你直接传入的JSON格式不会被篡改,Python能拿到标准的带双引号的JSON字符串,自然不会出现解析问题。
内容的提问来源于stack exchange,提问作者Grant Williams
相关产品推荐
相关产品推荐

