码农之家

专注优质代码开发,为软件行业发展贡献力量

.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");
    }

AI探究员大白

0 评论数