C#调用Python脚本的5种方法及代码实现
本文总结了在C#中调用Python脚本的五种常见方法。针对不同的项目需求(如是否依赖第三方库、对执行效率的要求等),开发者可以选择最适合的方案:从轻量级的IronPython嵌入到基于进程管理的标准命令行调用,再到打包成可执行文件的部署方式。
C#调用Python脚本的方法详解
在工程开发中,常需要将Python编写的机器学习或深度学习算法集成到C#架构的应用程序中。以下是五种典型的跨语言调用方案:
第1步:使用IronPython(仅适用于无第三方模块)
核心逻辑:通过NuGet安装 IronPython 包,直接在C#进程中创建Python解释器实例并执行脚本。
适用条件:仅限Python原生标准库。任何依赖NumPy、Pandas等C扩展的第三方模块均无法工作。
操作步骤:
- 在项目中添加
IronPython引用。 - 调用
Python.CreateEngine()创建引擎。 - 使用
ExecuteFile加载本地 .py 文件。
using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
static void Main(string[] args)
{
// 1. 创建解释器
ScriptEngine pyEngine = Python.CreateEngine();
// 2. 读取脚本(确保路径正确)
dynamic py = pyEngine.ExecuteFile(@"test.py");
// 3. 传入参数并执行函数
int[] array = new int[] { 9, 3, 5, 7, 2, 1, 3, 6, 8 };
string reStr = py.main(array);
Console.WriteLine(reStr);
}
第2步:利用Process调用独立脚本环境(通用性强)
核心逻辑:通过操作系统启动Python解释器进程执行脚本,适合需要完整Python环境的场景。
using System.Diagnostics;
Process p = new Process();
p.StartInfo.FileName = @"D:\Python\python.exe"; // 绝对路径或配置环境变量后的 'python.exe'
p.StartInfo.Arguments = "script.py arg1 arg2";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start();
p.WaitForExit();
第3步:C++混合编程(复杂度高,不推荐日常使用)
将Python脚本结合C++封装为动态链接库(DLL)。该方法受限于Python版本(32/64位一致性)、VS编译环境与系统依赖,实现极为繁琐且容易报错,仅在特殊底层交互时有参考意义。
第4步:直接命令行执行(推荐使用)
优点:兼容所有依赖库(支持Anaconda、虚拟环境),执行效率高,仅需简单的进程管理。
缺点:目标机器需提前配置好Python运行环境。
操作指南:
- 编写Python主程序:
main.py需接收命令行参数。
import sys
import numpy as np
def func(a, b):
# 模拟业务逻辑
return float(a) * float(b)
if __name__ == '__main__':
result = func(sys.argv[1], sys.argv[2])
print(result)
- C#调用代码实现:
public static void RunPythonScript(string scriptPath, params string[] arguments)
{
Process p = new Process();
// 设置解释器路径(若配了环境变量可简化为 python.exe)
p.StartInfo.FileName = @"D:\Python\envs\python3\python.exe";
// 拼接参数: script.py -u arg1 arg2
string args = scriptPath + " -u";
foreach (string arg in arguments) {
args += " " + arg;
}
p.StartInfo.Arguments = args;
// 捕获输出流
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.OutputDataReceived += (sender, e) => {
if (!string.IsNullOrEmpty(e.Data))
Console.WriteLine(e.Data); // 处理实时输出
};
p.Start();
p.BeginOutputReadLine();
p.WaitForExit();
}
第5步:调用打包后的Exe(适用于离线环境)
核心逻辑:利用 pyinstaller 将含依赖的Python脚本打包成单文件exe,C#只需调用该exe。虽然免去了部署环境的工作,但解压和运行过程较慢,不适合高频调用。
步骤概要:
- 在终端执行
pyinstaller -F main.py。 - C#中通过
Process.Start调用生成的dist/main.exe及其命令行参数。
以上就是C#调用Python脚本的详细内容,更多关于跨语言编程与数据交换的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









