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

如何在C#中获取Python脚本返回结果而无需打印输出

解决Python脚本返回结果给C#无需打印的问题

我明白你的痛点——直接return的结果C#读不到,用print又因为数据量大太慢。其实问题的核心很简单:C#读取的是Python进程的标准输出(stdout),而Python函数的return值不会自动输出到stdout,必须主动把结果写入标准输出才行。下面给你一套高效的解决方案:

第一步:修改Python脚本,高效输出结果

不用print,改用json.dumps序列化结果后写入标准输出,这种方式比直接print大列表快得多,因为是批量生成字符串而非逐个元素处理。同时避免用list当变量名(会覆盖Python内置类型):

import json
import sys

def func1():
    lst = [1,2,3,4,5]  # 用lst代替list作为变量名,避免覆盖内置类型
    return lst

# 将结果序列化为JSON字符串,写入标准输出
sys.stdout.write(json.dumps(func1()) + '\n')
# 强制刷新输出缓冲区,确保C#能完整读取所有内容
sys.stdout.flush()

如果你的数据量超大,还可以考虑用更紧凑的序列化格式(比如msgpack),但需要额外安装第三方库;JSON是Python和C#都内置支持的,最省心且兼容性强。

第二步:调整C#代码,解析JSON结果

现在C#读取到的是标准格式的JSON字符串,直接反序列化成对应的C#类型即可,比处理原始字符串方便多了。这里用.NET内置的System.Text.Json(也可以用Newtonsoft.Json,看你项目偏好):

using System;
using System.Diagnostics;
using System.Text.Json;

// ... 你的其他业务代码 ...

var process = new Process()
{
    StartInfo = new ProcessStartInfo
    {
        FileName = "python",
        Arguments = "-u /home/varun/Desktop/data.py",
        RedirectStandardOutput = true,
        RedirectStandardError = true,
        UseShellExecute = false,
        CreateNoWindow = true,
    }
};

process.Start();
string output = process.StandardOutput.ReadToEnd();
string error = process.StandardError.ReadToEnd();
process.WaitForExit();

if (string.IsNullOrEmpty(error))
{
    // 反序列化JSON为C#数组(也可以用List<int>,只需修改泛型参数)
    var result = JsonSerializer.Deserialize<int[]>(output);
    // 这里可根据需求返回强类型结果,或转成字符串返回
    return JsonSerializer.Serialize(result);
}
else
{
    Console.WriteLine(error);
    return error;
}

关键细节提醒

  • 你已经加了-u参数,这个很重要——它开启Python的无缓冲输出,确保结果能实时写入stdout,避免C#等待超时。
  • 一定要确保Python脚本里没有其他多余的print语句,否则这些额外输出会混入JSON结果,导致反序列化失败。
  • 如果你的结果是复杂结构(比如嵌套字典、自定义对象),JSON也能完美处理,只需对应调整C#的反序列化类型即可。

内容的提问来源于stack exchange,提问作者leo Martin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:59:39