需求: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); // 输出结果
}
}
}
}
其中自定义代码为

点击运行进行测试
运行结果如下
