c# 用pythonnet 嵌入Python代码
C# 用pythonnet 嵌入Python代码,可以导入第三方库和自己python代码
我的测试环境
- window10
- conda 23.1.0(python3.10.9)
- Microsoft Visual Studio Community 2022 (64 位) - Current版本 17.5.0
运行结果
步骤
- 安装python(或anaconda)
- 在VS项目NuGet中安装pythonnet
- 工具->NuGet->管理…
- 创建python环境
- 创建专用虚拟环境(windows下首先切换到要建立虚拟环境的根目录下),执行
conda create --prefix=D:condaenvenv_name python=3.10
路径及python版本根据需要自定义。- 使用Anaconda Prompt,激活虚拟环境
conda activate F:condaenvenv_name
- 安装Numpypip install numpy
- 如果为C#界面程序,需要配置为x64环境(与python吻合)
- 鼠标放在VS项目上,右键属性->生成->常规->目标平台->选择x64
- 如果是自己的代码,需要放到建立虚拟环境包目录“{虚拟环境安装位置}Libsite-packages”中
- 代码示例
- c#
using Python.Runtime;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.IO;string pathToVirtualEnv = "D:condaenvenv_name";//string pathToVirtualEnv = "E:anaconda3";Environment.SetEnvironmentVariable("PATH", pathToVirtualEnv, EnvironmentVariableTarget.Process);Environment.SetEnvironmentVariable("PYTHONHOME", pathToVirtualEnv, EnvironmentVariableTarget.Process);Environment.SetEnvironmentVariable("PYTHONPATH", $"{pathToVirtualEnv}Libsite-packages;{pathToVirtualEnv}Lib;E:anaconda3Librarybin;E:anaconda3Libraryusrbin;E:anaconda3Scripts", EnvironmentVariableTarget.Process);Runtime.PythonDLL = "D:condaenvenv_namepython310.dll";//Runtime.PythonDLL = "E:anaconda3python310.dll";PythonEngine.PythonHome = pathToVirtualEnv;PythonEngine.PythonPath = PythonEngine.PythonPath + ";" + Environment.GetEnvironmentVariable("PYTHONPATH", EnvironmentVariableTarget.Process);PythonEngine.Initialize();using (Py.GIL()){ dynamic np = Py.Import("numpy"); //dynamic np1 = Py.Import("test3"); //Console.WriteLine(np1.Add(2)); //Console.WriteLine(np.cos(np.pi * 2)); //py.hello(); double c = (double)(np.array(1)); Console.WriteLine(c);}
- winForm
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using Python.Runtime;namespace DemoPythonnet{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } public dynamic np = null; public dynamic a; public dynamic b; private void Form1_Load(object sender, EventArgs e) { string pathToVirtualEnv = "D:condaenvenv_name"; Environment.SetEnvironmentVariable("PATH", pathToVirtualEnv, EnvironmentVariableTarget.Process); Environment.SetEnvironmentVariable("PYTHONHOME", pathToVirtualEnv, EnvironmentVariableTarget.Process); Environment.SetEnvironmentVariable("PYTHONPATH", $"{pathToVirtualEnv}Libsite-packages;{pathToVirtualEnv}Lib", EnvironmentVariableTarget.Process); Runtime.PythonDLL = "D:condaenvenv_namepython310.dll"; PythonEngine.PythonHome = pathToVirtualEnv; PythonEngine.PythonPath = PythonEngine.PythonPath + ";" + Environment.GetEnvironmentVariable("PYTHONPATH", EnvironmentVariableTarget.Process); PythonEngine.Initialize(); np = Py.Import("numpy"); } private void button1_Click(object sender, EventArgs e) { //使用第三方库 using (Py.GIL()) { Console.WriteLine(np.cos(np.pi * 2)); dynamic sin = np.sin; Console.WriteLine(sin(5)); double c = (double)(np.cos(5) + sin(5)); Console.WriteLine(c); a = np.array(new List
{ 1, 2, 3 }); Console.WriteLine(a.dtype); b = np.array(new List { 6, 5, 4 }, dtype: np.int32); Console.WriteLine(b.dtype); Console.WriteLine(a * b); } } private void button2_Click(object sender, EventArgs e) { using (Py.GIL()) { Console.WriteLine(a * b); } } }}
感谢 https://blog.csdn.net/The_Moon_/article/details/127208124
感谢 https://blog.csdn.net/weixin_44064908/article/details/129270649