如何通过C#进程将JSON对象作为参数传递给Python脚本?
问题解决步骤
1. 修复Python的属性访问错误
Python的json.loads()返回的是字典对象,不是类实例,不能用.语法访问键值。修改代码为字典索引方式:
import sys import json dataObj = sys.argv[1] data = json.loads(dataObj) models = data['models'] # 替换原有的 data.models
如果习惯用.访问属性,可以用types.SimpleNamespace转换字典为对象:
import sys import json from types import SimpleNamespace dataObj = sys.argv[1] data = json.loads(dataObj, object_hook=lambda d: SimpleNamespace(**d)) models = data.models # 此时可正常使用点语法
2. 修复C#命令行参数的转义问题
JSON包含双引号时,直接传递会被Shell解析截断,导致Python收到不完整的JSON。有两种可靠解决方式:
方式一:转义JSON中的双引号
修改C#参数赋值代码,将JSON里的双引号转义为\":
var script = "D:\\python\\pythonscript.py"; var objectJson = new ObjectJson() { path = "C:\\Users\\user\\Documents\\myfile.txt", models = models }; var x = JsonConvert.SerializeObject(objectJson); // 转义双引号适配命令行格式 var escapedJson = x.Replace("\"", "\\\""); psi.Arguments = $"\"{script}\" \"{escapedJson}\""; psi.UseShellExecute = false; psi.CreateNoWindow = true; psi.RedirectStandardOutput = true; psi.RedirectStandardError = true; // 后续进程执行代码不变
方式二:通过标准输入传递JSON(更推荐)
完全避开命令行参数的转义问题,将JSON写入Python进程的标准输入:
C#端代码
var script = "D:\\python\\pythonscript.py"; var objectJson = new ObjectJson() { path = "C:\\Users\\user\\Documents\\myfile.txt", models = models }; var x = JsonConvert.SerializeObject(objectJson); psi.FileName = "python.exe"; // 明确指定Python执行路径 psi.Arguments = $"\"{script}\""; psi.UseShellExecute = false; psi.CreateNoWindow = true; psi.RedirectStandardOutput = true; psi.RedirectStandardError = true; psi.RedirectStandardInput = true; // 开启标准输入重定向 var errors = ""; var results = ""; using (var process = Process.Start(psi)) { // 将JSON写入标准输入 process.StandardInput.WriteLine(x); process.StandardInput.Close(); // 关闭输入告知Python数据传输完成 errors = process.StandardError.ReadToEnd(); results = process.StandardOutput.ReadToEnd(); process.WaitForExit(); }
Python端代码
import sys import json # 从标准输入读取完整JSON dataObj = sys.stdin.read() data = json.loads(dataObj) models = data['models'] # 或用SimpleNamespace转换后使用点语法
错误根源说明
- 使用
"""包裹JSON时,Shell解析会丢失部分引号,导致Python收到的JSON格式损坏(键缺少引号)。 - 使用未转义的
"{}"包裹JSON时,JSON内的双引号会被Shell当作参数结束符,导致Python收到截断的不完整JSON,无法解析。
内容的提问来源于stack exchange,提问作者Mariam Sultan
相关产品推荐
相关产品推荐

