C#.NET 与 Python 交互

若你要用.NET和Python交互,那么你可以使用两种技术:IronPython 和 Python.NET 。

但两者的基础实现和目标场景都不同,因此如何使用它们也有所不同。

IrconPython简称 IPy , Python.NET 也叫 pythonnet 或 Python for .NET ,下面分别介绍。

IronPython

IronPython 是一个开源的 Python 编程语言实现,它运行在 .NET 框架和 Mono 上。这个项目由 Jim Hugunin 创立,他也是 Jython 的创造者。IronPython 1.0 版本于 2006 年发布,而最新的稳定版本 2.7.12 是在 2022 年 1 月发布的。最新的 3.4.1 版本于 2023 年 7 月发布,包括对 .NET 5 的修复和对 .NET Core 及 .NET Standard 的支持。

IronPython 的主要特点包括:

紧密集成 .NET 类库:可以在 Python 代码中直接使用 .NET 类库。

与其他 .NET 语言的互操作性:可以在 C# 或 VB.NET 等 .NET 语言中使用 Python 代码。

动态类型系统:使用动态类型系统,使得 Python 代码能够轻松地移植到 .NET Framework 上。

IronPython 为开发者提供了 Python 语言的所有优势,同时增加了与 .NET 环境的无缝集成。这使得开发者可以在 .NET 应用程序中使用 Python 脚本,或者在 Python 程序中调用 .NET 类库,从而提高了代码的复用性和开发效率。

官网:https://ironpython.net/

NuGet 包地址:https://www.nuget.org/packages/IronPython

以下是在C#中调用Python代码的例子:

1. 在C#中执行Python脚本的简单例子:
var pythonEngine = IronPython.Hosting.Python.CreateEngine();
var pythonScript = pythonEngine.CreateScriptSourceFromString("print('Hello World')");
pythonScript.Execute();
这段代码会在控制台输出 Hello World  。
2. 从文件中加载并执行Python脚本:

var pythonEngine = IronPython.Hosting.Python.CreateEngine();
var pythonScript = pythonEngine.CreateScriptSourceFromFile("..\\..\\HelloWorld.py");
pythonScript.Execute();
Console.ReadKey();
假设 HelloWorld.py 文件包含 print('Hello World'),执行这段代码将会得到同样的输出。
3. 设置Python脚本的搜索路径并导入模块:
var pythonEngine = IronPython.Hosting.Python.CreateEngine();
Console.WriteLine("Search Paths:");
var searchPaths = pythonEngine.GetSearchPaths();

// 添加新的搜索路径
searchPaths.Add("..\\..");
pythonEngine.SetSearchPaths(searchPaths);

var pythonScript = pythonEngine.CreateScriptSourceFromFile("..\\..\\HelloWorld.py");
pythonScript.Execute();
在这个例子中,HelloWorld.py 脚本导入了一个名为 HelloWorldModule.py 的模块,该模块包含一个打印 Hello World 的函数。
4. 执行Python函数并获取返回值:
var engine = IronPython.Hosting.Python.CreateEngine();
var scope = engine.CreateScope();

// 从文件加载Python脚本
engine.ExecuteFile("MyPythonScript.py", scope);

// 调用Python函数并获取返回值
var result = engine.Operations.Invoke(scope.GetVariable("python_function_name"));
Console.WriteLine(result);
在这个例子中,MyPythonScript.py包含了一个名为 python_function_name的函数,我们在C#中调用这个函数并打印其返回值。
5. 在C#中处理Python异常:
try
{
    var engine = IronPython.Hosting.Python.CreateEngine();
    var scope = engine.CreateScope();

    // 执行可能会抛出异常的Python代码
    engine.Execute("raise ValueError('An error occurred')", scope);
}
catch (IronPython.Runtime.Exceptions.PythonException ex)
{
    Console.WriteLine(ex.Message);
}
这段代码尝试执行一个会抛出异常的Python代码,并在C#中捕获这个异常。
6. 使用Python脚本中定义的类:
var engine = IronPython.Hosting.Python.CreateEngine();
var scope = engine.CreateScope();

// 从文件加载Python脚本
engine.ExecuteFile("MyPythonScript.py", scope);

// 创建Python类的实例
dynamic MyClass = scope.GetVariable("MyClass");
dynamic myInstance = engine.Operations.CreateInstance(MyClass);

// 调用实例方法
myInstance.MyMethod();
在这个例子中,MyPythonScript.py 包含了一个名为 MyClass 的类,我们在C#中创建了这个类的实例并调用了它的方法 MyMethod。


Python.NET

Python.NET(也称为 pythonnet)是一个非常强大的库,它允许 Python 代码与 .NET 公共语言运行时 (CLR) 进行交互。这意味着 Python 开发者可以直接在他们的代码中使用 .NET 的类库和功能,而 .NET 开发者也可以在他们的应用程序中使用 Python 脚本。

Python.NET 的关键特性包括:

无缝集成:Python.NET 提供了与 CLR 的近乎无缝的集成,使得在 Python 代码中调用 .NET 类库和功能变得非常简单。

跨平台支持:它支持在 Windows、Linux 和 macOS 上的 .NET Framework 和 .NET Core。

动态类型:Python.NET 支持 .NET 对象的动态类型,这意味着你可以在 Python 中以动态的方式使用 .NET 对象,而不需要提前声明类型。

关键字参数:它还支持使用关键字参数来调用 .NET 方法,这使得代码更加清晰易读。

Python.NET 在多个领域都有实际应用,例如在网络爬虫领域,它可以使爬虫从 Python 代码访问 .NET 功能,如加载提供 Web 服务客户端或 Web 浏览器控件的 .NET 程序集,与网站进行通信或呈现其内容。这样,Python.NET 可以利用 .NET 的强大功能来增强网络爬虫的功能和性能。

此外,Python.NET 还可以用于数据科学和机器学习项目,因为它允许开发者将 Python 中流行的库(如 NumPy、Pandas 和 Matplotlib)与 .NET 生态系统中的工具和库结合起来使用。


项目地址:https://github.com/pythonnet/pythonnet
NuGet包:https://www.nuget.org/packages/pythonnet/3.1.0-preview2024-03-03


以下是在C#中调用Python代码的例子:

1. 在.NET中调用Python代码并获取结果:

using Python.Runtime;

class Program
{
    static void Main()
{
        using (Py.GIL()) // 初始化Python引擎
        {
            dynamic np = Py.Import("numpy");
            Console.WriteLine(np.cos(np.pi * 2));
            
            dynamic sin = np.sin;
            Console.WriteLine(sin(5));
        }
    }
}

这段代码演示了如何在C#程序中使用Python.NET来调用numpy库的函数。

2. 在.NET中创建Python对象并调用其方法:

using Python.Runtime;

class Program
{
    static void Main()
    {
        using (Py.GIL()) // 初始化Python引擎
        {
            dynamic plt = Py.Import("matplotlib.pyplot");
            plt.plot(new[] { 1, 2, 3 }, new[] { 4, 5, 6 });
            plt.show();
        }
    }
}

这段代码展示了如何创建一个matplotlib的plot对象,并在.NET应用程序中显示它。

3. 在.NET中处理Python异常:

using Python.Runtime;

class Program
{
    static void Main()
    {
        using (Py.GIL()) // 初始化Python引擎
        {
            try
            {
                dynamic os = Py.Import("os");
                Console.WriteLine(os.getcwd());
                os.chdir("/nonexistent/directory");
            }
            catch (PythonException ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

这段代码尝试更改当前工作目录到一个不存在的路径,并捕获并处理Python异常。

对比

IronPython 和 Python.NET 都是用于在 .NET 环境中运行 Python 代码的工具,但它们在设计和使用上有一些关键的区别。

IronPython 是一个完全基于 .NET 的 Python 实现,它允许你在 .NET 应用程序中直接使用 Python 代码。它与 .NET 类库紧密集成,可以让你在 Python 代码中直接调用 .NET 类库和功能。如果你的项目主要基于 .NET 框架,或者你想要与其他 .NET 语言(如 C# 或 VB.NET)进行深度集成,IronPython 是一个很好的选择。此外,IronPython 不受全局解释器锁(GIL)的限制,这意味着在多核场景中,它可能比 Python.NET 有优势。

Python.NET(也称为 pythonnet)是一个库,它允许标准的 CPython 运行时与 .NET CLR 进行交互。这意味着你可以在一个主要基于 Python 的应用程序中集成一两个 .NET 组件。如果你已经有一个基于 Python 的项目,并且只想添加一些 .NET 功能,Python.NET 可能是更合适的选择。Python.NET 需要一个常规的 Python 解释器来运行,而且它不支持将脚本编译成二进制形式,这与 IronPython 不同。

总的来说,如果你需要完全在 .NET 环境中工作,IronPython 提供了更深层次的集成。而如果你只是想在 Python 项目中使用一些 .NET 功能,Python.NET 可能会更加方便。每种工具都有其特定的用例和优势,选择哪一个取决于你的具体需求和项目背景。

IronPython 和 Python.NET 的对比表:

特性

IronPython

Python.NET

实现

.NET 的 Python 实现

允许 CPython 与 .NET CLR 交互的库

集成程度

紧密集成 .NET 类库

与 .NET 类库交互,但不如 IronPython 紧密

设计用途

在 .NET 环境中完全使用 Python

在 Python 项目中添加 .NET 功能

版本

最新稳定版 3.4.1

(2023年1月12)

根据 CPython 版本更新

动态类型

支持

支持

互操作性

与 C#、VB.NET 等 .NET 语言深度集成

主要用于在 Python 中调用 .NET 组件

编译

可以编译成二进制形式

不支持编译成二进制形式

GIL

不受 GIL 限制

受 GIL 限制

相关推荐

  1. PythonHTTP服务交互

    2024-03-26 16:36:02       45 阅读
  2. C#.NET Python 交互

    2024-03-26 16:36:02       45 阅读
  3. python如何前端交互

    2024-03-26 16:36:02       22 阅读
  4. debugger,pythonjs代码交互

    2024-03-26 16:36:02       33 阅读
  5. mongodb和python交互

    2024-03-26 16:36:02       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-26 16:36:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-26 16:36:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-26 16:36:02       87 阅读
  4. Python语言-面向对象

    2024-03-26 16:36:02       96 阅读

热门阅读

  1. HTTP 状态码及分类

    2024-03-26 16:36:02       41 阅读
  2. 3.25C++

    3.25C++

    2024-03-26 16:36:02      41 阅读
  3. 蓝桥杯day13刷题日记

    2024-03-26 16:36:02       36 阅读
  4. python OpenCV的使用

    2024-03-26 16:36:02       39 阅读
  5. xv6项目开源—04

    2024-03-26 16:36:02       38 阅读
  6. Python中实现跑马灯效果

    2024-03-26 16:36:02       43 阅读
  7. 如何在Django中实现WebSocket通信

    2024-03-26 16:36:02       54 阅读