本地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 jsondef hello_world():"""简单的问候函数"""return "Hello from Python!"def add_numbers(a, b):"""加法函数"""return a + bdef 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_valuedef add(self, x):self.value += xreturn self.valuedef multiply(self, x):self.value *= xreturn self.valuedef get_value(self):return self.valuedef reset(self):self.value = 0return 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); // 输出结果}}}
}
其中自定义代码为
点击运行进行测试
运行结果如下