本地window10同步ubuntu上conda指定环境,并在C#项目中通过Python.NET调用自定义python接口

需求:C#项目通过Python.NET方式调用自定义python接口

前提:确保ubuntu上的conda环境能正常运行你自定义的python代码

一、window10安装anaconda

如果你已经安装则跳过,如果没有安装则根据网上教程进行安装

可参考该教程:https://openai.wiki/anaconda-and-miniconda-windows-install.html

二、ubuntu通过使用Jupyter工具导出指定conda环境

如果没有Jupyter网上搜索教程进行安装并运行,这里只讲如何导出指定conda环境

ubuntu通过conda激活指定环境,比如我的是milvus,则命令如下

复制代码
# 激活要导出的环境
conda activate your_env_name

# 导出完整环境
conda env export > environment.yml

执行完导出命令后会在当前目录下看到environment.yml文件

三、window10同步环境

1、通过SCP命令从远程服务器复制environment.yml文件,我将该文件复制到我本地的

D:\study\NetPython下

其中root是账户,可以改成你自己的环境所属账户,192.168.0.156换成你的服务器IP,55899是我的ssh连接端口,也需要将端口换成你自己的

复制代码
scp -P 55899 root@192.168.0.156:environment.yml D:\study\NetPython\

2、同步

复制代码
# 1. 查看文件内容
type D:\study\NetPython\environment.yml

# 2. 如果是conda环境
conda env create -f D:\study\NetPython\environment.yml
conda activate 环境名

同步成功后会在你的anaconda安装目录的envs,指定conda环境下生成相关文件

例如我的环境命名是milvus,以下是我同步环境后生成的示例

截至到这是演示同步python环境,下面开始演示C#项目中通过Python.NET调用自定义python接口,

将你自定义的.py代码放在如下所示目录

复制代码
# test123.py
import math
import json

def hello_world():
    """简单的问候函数"""
    return "Hello from Python!"

def add_numbers(a, b):
    """加法函数"""
    return a + b

def calculate_stats(numbers):
    """计算统计信息"""
    if not numbers:
        return {}
    
    return {
        "sum": sum(numbers),
        "average": sum(numbers) / len(numbers),
        "max": max(numbers),
        "min": min(numbers),
        "count": len(numbers)
    }

def process_text(text):
    """文本处理函数"""
    words = text.split()
    return {
        "word_count": len(words),
        "character_count": len(text),
        "uppercase": text.upper(),
        "words": words
    }

class Calculator:
    """一个简单的计算器类"""
    
    def __init__(self, initial_value=0):
        self.value = initial_value
    
    def add(self, x):
        self.value += x
        return self.value
    
    def multiply(self, x):
        self.value *= x
        return self.value
    
    def get_value(self):
        return self.value
    
    def reset(self):
        self.value = 0
        return self.value

# 测试代码
if __name__ == "__main__":
    print(hello_world())
    print(add_numbers(10, 20))
    print(calculate_stats([1, 2, 3, 4, 5]))

用visual studio创建一个控制台应用程序,项目命名为NetPython的,选择.net8

Nuget导入pythonnet包

代码如下

Program.cs

复制代码
using Python.Runtime;

namespace  NetPython

{
    public static class Program
    {
        static void Main(string[] args)
        {
            var pythonHelp = new PythonHelp();
            pythonHelp.GetSatisRank();
        }
    }
}

PythonHelp.cs

复制代码
using Python.Runtime;

namespace NetPython
{
    public class PythonHelp
    {
        private static int Count = 0;

        static PythonHelp()
        {
            PythonHelp.Init();
        }

        public static void Init()
        {
            try
            {
                bool flag = !PythonEngine.IsInitialized;
                if (flag)
                {
                    string configValue = "C:\\Users\\Admin\\anaconda3\\envs\\milvus";
                    Runtime.PythonDLL = Path.Combine(configValue, "python311.dll");
                    PythonEngine.PythonHome = Path.Combine(configValue, "python.exe");
                    string text = "";
                    string[] array = new string[]
                    {
                        "tcl",
                        "DLLs",
                        "Lib",
                        "Lib/site-packages",
                        "Lib/site-packages/matplotlib/mpl-data/fonts/ttf",
                        "Lib/site-packages/win32",
                        "Lib/site-packages/win32/lib"
                    };
                    foreach (string text2 in array)
                    {
                        text = string.Concat(new string[]
                        {
                            text,
                            configValue,
                            "/",
                            text2,
                            ";"
                        });
                    }
                    PythonEngine.PythonPath = text;
                    PythonEngine.Initialize();
                    PythonEngine.BeginAllowThreads();
                    PythonHelp.Count = 0;
                }
                else
                {
                    PythonHelp.Shutdown();
                    PythonHelp.Init();
                }
            }
            catch (Exception ex)
            {
                bool flag2 = PythonHelp.Count > 5;
                if (flag2)
                {
                    PythonHelp.Count = 0;
                    throw new Exception("初始化重试次数过多,错误:" + ex.Message);
                }
                PythonHelp.Count++;
                PythonHelp.Shutdown();
                PythonHelp.Init();
            }
        }

        public static void Shutdown()
        {
            var gil = Py.GIL();
            if (gil != null) gil.Dispose();
            PythonEngine.Shutdown();
        }

        public void GetSatisRank()
        {
            using (Py.GIL())
            {
                dynamic myscript = Py.Import("test123"); // 导入你的Python模块(不带.py扩展名)
                dynamic result = myscript.add_numbers(6, 2); // 调用函数并传递参数
                Console.WriteLine(result); // 输出结果
            }
        }


    }
}

其中自定义代码为

点击运行进行测试

运行结果如下

相关推荐
6190083363 小时前
linux 安装jdk
java·linux·运维
waves浪游4 小时前
基础开发工具(中)
linux
艾莉丝努力练剑4 小时前
【C++模版进阶】如何理解非类型模版参数、特化与分离编译?
linux·开发语言·数据结构·c++·stl
wdfk_prog4 小时前
[Linux]学习笔记系列 -- [kernel][irq]softirq
linux·笔记·学习
迎風吹頭髮4 小时前
Linux服务器编程实践60-双向管道:socketpair函数的实现与应用场景
linux·运维·服务器
试试勇气4 小时前
Linux学习笔记(九)--Linux进程终止与进程等待
linux·笔记·学习
wheeldown4 小时前
【Linux】Linux 进程信号核心拆解:pending/block/handler 三张表 + signal/alarm 实战
linux·运维·服务器
运维老司机4 小时前
ThinkPad 安装 Ubuntu 系统教程
linux·运维·ubuntu
云飞云共享云桌面6 小时前
替代传统电脑的共享云服务器如何实现1拖8SolidWorks设计办公
linux·运维·服务器·网络·电脑·制造