如何在 C# 中运行 Python 代码

前言

Python是一门强大的编程语言。特别的是,它还具有众多出色的库(例如numPy,sciPy,pandas等),可以显著简化和加速开发。因此,在解决某些问题时,通过 Python 实现可能是最理想的方式!.

但是,我们又希望代码能在 C# 中运行。

那么,可以试试pythonnet

pythonnet

pythonnet可以将 Python 代码集成运行在 .NET 4.0+ 的公共语言运行时(CLR)中。

需要注意的是,它并不是将 Python 代码编译成 IL 代码,而是将 Python 的 CPython 引擎与 .NET 运行时集成,以保证 CLR 可以使用现有的 Python 代码和 C-API 扩展,同时保持 Python 代码的本机执行速度。

Demo

1. 创建项目

创建一个控制台项目,引用 pythonnet Nuget 包。

注意,必须勾选“包括预发行版”,才能看到官方维护的 Nuget 包:

如何在 C# 中运行 Python 代码

计算机上需要安装 Python 3

2. 初始化

需要先设置Runtime.PythonDLL属性, 否则程序会抛出BadPythonDllException

如何在 C# 中运行 Python 代码

具体文件位置对应你安装的 Python 版本和文件夹:

Runtime.PythonDLL = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.LocalApplicationData),
    @"Programs\Python\Python310\python310.dll");

PythonEngine.Initialize();

3. 使用 Python 库

所有对 python 的调用都必须在一个using (Py.GIL())块中。

使用Py.Import导入 python 模块后,你就可以正常调用对应的函数:

这里,我们使用了numpy库(需要已经 pip install):

dynamic np = Py.Import("numpy");
Console.WriteLine(np.pi);

4. 使用 Python 脚本

我们也可以执行 Python 脚本代码。

首先,创建DemoCode.py文件,定义了Demo类和SayHello方法,代码如下:

class Demo:
    def SayHello(self, name):
        return "Hello " + name

调用代码如下:

dynamic demoCode = Py.Import("DemoCode");  
//实例化 Demo 类
dynamic demo = demoCode.Demo();  
//调用 Demo 类的 SayHello 方法
Console.WriteLine(demo.SayHello("MyIO"));

最后,运行结果如下图:

如何在 C# 中运行 Python 代码

结论

利用pythonnet,在 C# 中运行 Python 代码就是这么简单!