🚀 方法一:Process进程调用(命令行交互)
原理:通过System.Diagnostics.Process启动独立Python进程,通过命令行参数/标准输入输出传递数据
优点:
- 实现简单,无需额外依赖库
- 支持所有Python版本和第三方库(如numpy、TensorFlow)
- 隔离性强(Python崩溃不影响C#主程序)
缺点:
- 性能开销大(进程启动/销毁耗时20-50ms)
- 数据传递需序列化(JSON/CSV),不支持复杂对象
- 无法直接调用函数,只能执行脚本文件
应用场景:低频调用的独立任务(如数据报表生成、图片处理)、需要隔离Python环境的场景
代码示例:
var startInfo = new ProcessStartInfo {FileName = "python.exe",Arguments = "script.py --input data.json",RedirectStandardOutput = true,UseShellExecute = false
};
using (var process = Process.Start(startInfo)) {string result = process.StandardOutput.ReadToEnd();
}🔄 方法二:IronPython(.NET原生Python引擎)
原理:基于.NET实现的Python解释器,直接在CLR中执行Python代码
优点:
- 零进程开销,调用延迟<1ms
- 支持托管类型互操作(C#对象 ↔ Python对象)
- 可嵌入脚本引擎,实现动态代码执行
缺点:
- 仅支持Python 2.7/3.4(部分版本),不兼容最新Python库
- 无法调用CPython扩展模块(如PyTorch、OpenCV)
- 社区维护活跃度低
应用场景:轻量级脚本集成(如配置解析、规则引擎)、.NET生态内的功能扩展
代码示例:
var engine = Python.CreateEngine();
var scope = engine.CreateScope();
engine.ExecuteFile("script.py", scope);
dynamic func = scope.GetVariable("calculate");
var result = func(10, 20); // 直接调用Python函数🌉 方法三:Python.NET(CPython互操作库)
原理:通过C++/CLI封装CPython API,实现.NET与原生Python的双向通信
优点:
- 支持最新Python 3.x和所有第三方库
- 高性能(调用延迟≈5ms),支持复杂类型传递
- 可在C#中直接操作Python对象(如
list、dict)
缺点:
- 需手动管理GIL(全局解释器锁)
- 跨平台部署复杂(依赖Python环境)
- 调试难度大(混合托管/非托管代码)
应用场景:科学计算集成(如调用Scikit-learn模型)、高频Python函数调用
代码示例:
using (Py.GIL()) { // 申请GIL锁dynamic np = Py.Import("numpy");dynamic arr = np.array(new int[] { 1, 2, 3 });Console.WriteLine(arr.sum()); // 调用numpy方法
}📡 方法四:REST API(HTTP服务通信)
原理:Python通过Flask/FastAPI搭建Web服务,C#通过HTTP请求调用
优点:
- 彻底解耦,支持跨机器/跨平台部署
- 便于水平扩展(负载均衡、容器化)
- 支持异步调用和超时控制
缺点:
- 网络开销大(延迟10-100ms)
- 需处理API版本管理和序列化
- 增加服务部署复杂度
应用场景:微服务架构、分布式系统、需要远程调用Python能力的场景
Python服务示例:
# FastAPI服务
from fastapi import FastAPI
app = FastAPI()
@app.post("/predict")
def predict(data: list):return {"result": model.predict(data)}C#调用示例:
var client = new HttpClient();
var response = await client.PostAsJsonAsync("http://localhost:8000/predict", new { data = new[] {1.2, 3.4} }
);🛠️ 方法五:Python转DLL(C++中间层封装)
原理:通过Cython或pybind11将Python函数编译为C++ DLL,C#再调用DLL
优点:
- 性能接近原生调用(延迟<1ms)
- 隐藏Python依赖,部署简单
- 支持复杂数据类型(结构体、数组)
缺点:
- 实现复杂(需编写C++封装代码)
- 不支持动态更新Python代码
- 受Python版本和架构(32/64位)限制
应用场景:高性能关键路径(如实时数据处理、游戏引擎插件)、需保护Python源码的场景
实现流程:
- Python函数 → C++包装(pybind11)
- 编译为DLL
- C#通过P/Invoke调用DLL

💡 选型决策指南
-
高频调用(>100次/秒) → Python.NET或Python转DLL
✅ 例:实时数据处理管道、游戏AI逻辑 -
深度学习/科学计算 → Python.NET或REST API
✅ 例:C#客户端调用PyTorch模型(Python.NET适合本地部署,REST适合云端服务) -
脚本动态更新 → Process调用或IronPython
✅ 例:可配置的业务规则引擎、用户自定义脚本 -
跨团队协作 → REST API
✅ 例:算法团队维护Python服务,C#团队通过API调用 -
严格隔离需求 → Process调用或REST API
✅ 例:处理不可信Python代码、需要资源限制的场景
实战建议:优先用Python.NET(平衡性能与兼容性)或Process调用(简单可靠),复杂架构考虑REST API解耦。避坑点:IronPython不支持numpy等C扩展库,生产环境慎用!