本地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); // 输出结果
            }
        }


    }
}

其中自定义代码为

点击运行进行测试

运行结果如下

相关推荐
_别来无恙_13 分钟前
TFTP的使用Linux
linux·服务器
Zaralike22 分钟前
Linux 服务器网络不通排查 SOP(标准操作流程)
linux·服务器·网络
getapi1 小时前
注塑件的费用构成
linux·服务器·ubuntu
郝学胜-神的一滴1 小时前
深入解析C/S模型下的TCP通信流程:从握手到挥手的技术之旅
linux·服务器·c语言·网络·网络协议·tcp/ip
释怀不想释怀2 小时前
Linux网络基础(ip,域名)
linux·网络·tcp/ip
初願致夕霞2 小时前
Linux_进程
linux·c++
开开心心就好2 小时前
AI人声伴奏分离工具,离线提取伴奏K歌用
java·linux·开发语言·网络·人工智能·电脑·blender
lucky-billy2 小时前
Ubuntu 下一键部署 ROS2
linux·ubuntu·ros2
Thera7772 小时前
【Linux C++】彻底解决僵尸进程:waitpid(WNOHANG) 与 SA_NOCLDWAIT
linux·服务器·c++
阿梦Anmory2 小时前
Ubuntu配置代理最详细教程
linux·运维·ubuntu