.net 调用python代码两种常用方式
在.NET(例如C#)中调用Python代码有多种方式,每种方式有其特定的使用场景和优缺点。我们主要讲解2种常用的方法。下面是常见的2种方法:
一. 使用PythonNet (pythonnet)
PythonNet(pythonnet)是一个允许.NET程序调用Python代码的库。首先,需要在Python环境中安装pythonnet。
1.在Python环境中安装pythonnet:pip install pythonnet.
2.在C#中引入和使用pythonnet。使用包管理工具引入pythonnet。
using System;
using Python.Runtime;
class Program
{
static void Main()
{
// 初始化python环境(通常只需要在应用程序启动时做一次)
PythonEngine.Initialize();
using (Py.GIL()) // 确保线程安全地使用Python代码
{
//导入 Python 库
dynamic sys = Py.Import("sys");
dynamic os = Py.Import("os");
//调用 Python 库的方法
//Console.WriteLine("Python 版本: " + sys.version);
//Console.WriteLine("当前目录: " + os.getcwd());
//导入Python自定义模块,文件在bin目录下
// 生产环境使用真实路径
string strPyPath = @"E:\系统代码\AIWorks\SRC\AIWorkPython\AIWorkPython\ActionBLL";// 添加自定义路径
sys.path.append(strPyPath); // 添加自定义路径
//简单调用示例,导入script模块,调用模块中的my_function函数
dynamic pyFunc = Py.Import("script").my_function; // 导入并调用Python函数
Console.WriteLine(pyFunc()); // 调用函数并打印结果
dynamic py = null;
switch(IntAskType)
{
case 1://DeepSeek Api调用
py = Py.Import("DeepSeekRquestApi");
//创建DeepSeekAPI类的一个实例
dynamic modelDeepSeekAPI = py.DeepSeekAPI();
//调用实例中的方法
strReturn = modelDeepSeekAPI.ask_question(StrAsk, true);
break;
case 2://Ollama(本地文件知识库)
py = Py.Import("ReaderTxtByLocalOllama");
strReturn = py.read_txt_by_local_ollama(StrAsk);
break;
}
}
}
}
二. 使用HTTP服务(REST API)
如果你的Python代码已经是一个Web服务(例如使用Flask或Django),你可以通过HTTP请求来调用这些服务。在C#中,你可以使用HttpClient类来发送请求。
如下是控制台实现方法:
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync("http://localhost:5000/api/data"); // 替换为你的API端点URL
if (response.IsSuccessStatusCode)
{
string responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody); // 打印响应体内容
}
}
}
}
如果是.net mvc controll里面调用,需要先实例化:
private readonly HttpClient _httpClient;
public DeepSeekController()
{
_httpClient = _httpClientFactory.CreateClient();
}
public async Task<IActionResult> GetFromPython()
{
var response = await _httpClient.GetAsync("http://localhost:55113/api/data");
if (response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync();
return Ok(content);
}
return StatusCode(500, "Error calling the Python service");
}