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 限制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/769727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java校园跑腿管理系统设计与实现(源码+部署文档)

博主介绍: ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到 Java项目精品实…

《SQL必知必会第五版》第十五章(插入数据)挑战题

1. 使用 INSERT 和指定的列,将你自己添加到 Customers 表中。明确列出要添加哪几列,且仅需列出你需要的列。 INSERT INTO Customers(cust_id,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country,cust_contact,cust_email) VALUES(…

简单函数_加减乘除

任务描述 对输入的算式进行简单的运算,输出算式结果。运算符只会是加、减-、乘*、除/、求余%、阶乘!之一。 输出运算的结果,如果出现除数为零,则输出“error”,如果求余运算的第二个运算数为0,也输出“error”。 输入…

自定义collate_fn函数:应对报错RuntimeError: stack expects each tensor to be equal size

使用BERT或ResNet分别生成文本和图像特征时,由于文本自身长度和图像大小的限制,导致最后形成的特征数据在送入DataLoader时会因为维度不同而报错: RuntimeError: stack expects each tensor to be equal size此时就需要自定义collate_fn函数实现数据的自定义加载功能,下面…

UR5 机器人 URDF 代码阅读

系列文章目录 文章目录 系列文章目录前言一、UR5 URDF 代码二、base_link三、shoulder_pan_joint四、shoulder_pan_trans五、ROS base_link 坐标系到 UR 机器人 Base 坐标系的转换六、与全零TCP&#xff08;工具坐标系&#xff09;重合的工具链接 前言 一、UR5 URDF 代码 <…

算法人生(8):从“注意力算法”看“战胜拖延”(被分心太多版)

现代人拖延产生的原因有很多&#xff0c;比如因为害怕失败而拖延&#xff0c;因为完美主义倾向而拖延&#xff0c;不想走出“舒适区”而拖延等等&#xff0c; 今天我们要针对一个常见的原因“被分心的事情太多”而产生的拖延来看&#xff0c;如何从“注意力算法”的思路中找到些…

类型双关联合体(C++基础)

类型双关 类型双关就是在同样的一个内存中&#xff0c;存储的数据可以用做不同类型的表述。用在底层性能优化的时候&#xff0c;一般使用的时候要非常小心&#xff0c;因为不当的使用可能导致程序的不稳定和不可预测的行为。 int a 5;//double value (double)a;double value…

软考信息系统项目管理师2024上半年报名流程及注意事项

2024年5月软考信息系统项目管理师报名入口&#xff1a; 中国计算机技术职业资格网&#xff08;http://www.ruankao.org.cn/&#xff09; 2024年软考报名时间暂未公布&#xff0c;考试时间上半年为5月25日到28日&#xff0c;下半年考试时间为11月9日到12日。不想错过考试最新消…

Qt Design Studio 软件怎么用(详细+通俗+有趣)

建议&#xff1a;本文长期更新&#xff0c;建议点赞/收藏&#xff01; 1. 啥是Qt Design Studio&#xff1f; Qt Design Studio 是一个用于设计和开发用户界面的工具&#xff0c;特别适合开发跨平台应用程序。它结合了UI设计和开发的工作流程&#xff0c;使得设计师和开发者可…

桌面显示器PD芯片:引领桌面显示技术的新篇章

随着科技的飞速发展&#xff0c;桌面显示器作为人们日常工作与生活中不可或缺的重要设备&#xff0c;其性能与品质也在不断提升。其中&#xff0c;PD芯片作为桌面显示器中的核心组件&#xff0c;发挥着至关重要的作用。本文将对桌面显示器PD芯片进行详细介绍&#xff0c;探讨其…

如何确定ISO体系认证的范围?越大越好是否合理?

什么叫认证范围 ISO认证范围是指企业在申请ISO体系认证时&#xff0c;确定管理体系所涉及的业务范围。这个范围通常包括产品、服务、活动等方面&#xff0c;是企业为了提升管理水平、增强竞争力而选择实施ISO体系认证时需要考虑的重要因素之一。 ISO体系认证的范围主要包括两…

【Leetcode】top 100 二叉树

基础知识补充 完全二叉树&#xff1a;顺序存储&#xff08;数组&#xff09; 非根节点的父节点序号floor((i-1)/2) 序号i的左孩子节点序号2*i1 右孩子节点序号2*i2 一般二叉树&#xff1a;链式存储 结构&#xff1a;left指针指向左子节点&#xff0c;right指针指向右子节点&am…

JAVA 100道题(17)

17.创建一个方法&#xff0c;接受一个整数作为参数&#xff0c;并检查它是否为正数。如果不是&#xff0c;则抛出自定义异常。 首先&#xff0c;你需要定义一个自定义的异常类。在Java中&#xff0c;你可以通过继承 Exception 类来创建自定义异常。然后&#xff0c;你可以创建一…

区区文件操作

一、概念 数据存到内存中&#xff0c;程序退出、掉电数据就丢失了 数据存到硬盘中&#xff0c;就是存储在文件中&#xff0c;数据就不会因为掉电、程序退出就丢失。想要数据持久化&#xff0c;就要使用文件。 二、分类 什么是文件&#xff1f; 硬盘&#xff08;磁盘&#…

springcloud 复习day2~[条件装配]

条件装配: 注解:Condition 定义一个注解 import org.springframework.context.annotation.Conditional;import java.lang.annotation.*;/*** author Gavin*/ Retention(RetentionPolicy.RUNTIME) Target({ElementType.TYPE, ElementType.METHOD}) Documented Conditional(Lo…

ffmpeg拉流并解码

流程 注意事项 版本不同导致的api差异资源安全释放

激光焊接机在不锈钢三角阀制造中的应用与发展

不锈钢三角阀激光焊接机是一种专门用于焊接不锈钢三角阀的高效、精准设备。这种设备在不锈钢三角阀的制造过程中起到了至关重要的作用&#xff0c;其应用主要体现在以下几个方面&#xff1a; ​ 一、激光焊接机在不锈钢三角阀制造中的应用 激光焊接机以其独特的优势&#xff…

力扣450 删除二叉搜索树中的节点 Java版本

文章目录 题目描述思路代码 题目描述 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除…

【CKA模拟题】如何发布一个SVC资源

题干 For this question, please set this context (In exam, diff cluster name) kubectl config use-context kubernetes-adminkubernetesYou have an existing Nginx pod named nginx-pod . Perform the following steps: Expose the nginx-pod internally within the cl…