You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 06:06:11