C#使用IronPython调用Python

news2025/4/7 18:05:32

一、前言

以下摘自百度百科:

IronPython 是一种在 NET 和 Mono 上实现的 Python 语言,由 Jim Hugunin(同时也是 Jython 创造者)所创造。1.0 版于2006年9月5日发布。
随后,在 2007 年,开发者决定改写架构,使用动态类型系统以让更多脚本语言能很容易地移植到NET Framework上。2008 年,随着微软发布 NET Framework3.0/3.5、Silverlight 之后, IronPython也发布了 2.0 版,最新版本是 2.7,于 2011年3月发布,支持.NET Framework 4.0。

我们可以把IronPython理解为在.NET平台上实现的python解释器,我们可以使用IronPython进行python脚本的调用,也可以反过来,使用IronPython调用C#的功能。

目前IronPython支持两个python版本,python2.7及python3.4,可根据自己实际需要进行版本选择。最新版本为支持python3.4的3.4版本,支持的.NET最低版本为.NET Framework4.6.2,也可在.NET Core、.NET5、.NET6上使用。

IronPython官网:https://ironpython.net。

本文将以.NET5的控制台应用程序,实际演示通过IronPython在C#中调用Python脚本。

本文源代码已上传至GitHub,链接如下:

https://github.com/XMNHCAS/IronPythonDemo

二、IronPython安装配置

打开Nuget管理工具,搜索IronPython,如下图所示:

不需要调用任何包的情况下,只安装第一个即可。

IronPython.StdLib是Python标准库,如果需要调用标准库则需要安装这个包。安装完成后,如果程序编译之后不将此包的文件复制至编译环境,则需要在项目的csproj文件中添加以下配置项:

<ItemGroup>
    <Content Include="lib\**">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
</ItemGroup>
<ItemGroup>
    <None Update="lib\**">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
</ItemGroup>

ps:使用此库,推荐安装VS的Python支持,否则可能会出现编译失败的情况。

三、基础使用及标准库使用

1、创建python脚本

项目创建完成后,在项目中添加一个文件夹,此处命名为“PythonScripts”,此文件夹用于放置所有python脚本以及第三方库。创建完成后,在此文件夹中添加一个main.py文件,用以编写我们的python示例脚本。

在main.py中添加以下函数,然后把文件属性的“复制到输出目录”一项改为“如果较新则复制”

此示例调用了python的uuid标准库,所以需要安装前文提及的“IronPython.StdLib”包。

import sys
import uuid

def Test():
    return 'Hello IronPython!'


def SysVersion():
    return sys.version


def CreateUUID():
    return str(uuid.uuid1())

2、调用脚本

在Program.cs文件中,修改Main函数:

using IronPython.Hosting;
using System;

namespace IronPythonDemo
{
    class Program
    {
        static void Main(string[] args) 
        {
            // 创建python解释器
            var engine = Python.CreateEngine();
            // 加载脚本文件
            dynamic py = engine.ExecuteFile(@"PythonScripts/main.py");

            // 调用Python脚本的Test函数
            Console.WriteLine("Test:");
            var data = py.Test();
            Console.WriteLine(data);

            Console.WriteLine();

            // 查看IronPython的Python版本及使用的.NET版本
            Console.WriteLine("Python & .NET Version:");
            var version = py.SysVersion();
            Console.WriteLine(version);

            Console.WriteLine();

            // 使用Python的UUID标准库生成基于时间戳的UUID
            Console.WriteLine("Create UUID By Python:");
            var uuid = py.CreateUUID();
            Console.WriteLine(uuid.ToString());

            Console.ReadKey();
        }
    }
}

运行结果如下:

四、IronPython调用第三方库

IronPython调用python第三方库,需要将调用的第三方库文件拷贝至输出目录,并使用IronPython加载。由于IronPython目前支持的python版本是2.7及3.4,所以需要注意第三方库的版本,根据实际需要选择IronPython可支持的库版本。

由于需要复制第三方库的文件,建议创建单独的python项目并配置虚拟环境,以便python脚本的函数测试以及后续的文件拷贝。

以下以调用requests库为例,示范IronPython如何调用第三方库。

1、创建python虚拟环境

在需要创建虚拟环境的目录下,打开cmd,并运行以下命令。

注意:python版本应为3.4,如果本地存在多个版本的解释器,请将命令中的python改为3.4的版本的python.exe路径。

python -m venv env

创建完成后,就会出现一个env的文件夹,这个文件夹就是我们的虚拟环境了。

2、python虚拟环境安装requests库。

由于我们使用的IronPython支持的python版本是3.4,所以我们安装的requests库也应该是支持python3.4的版本,如2.15.1。

首先要运行以下命令,启动虚拟环境:

env\Scripts\activate.bat

然后使用pip安装requests 2.15.1:

pip install requests==2.15.1

如下图所示:

3、使用requests

我们可以请求requests的官方示例接口,如下所示:

import requests as req


def GetReqTest():
    res = req.get('https://httpbin.org/basic-auth/user/pass', auth=('user', 'pass'))
    return res.text


if __name__ == '__main__':
    res_json = GetReqTest()
    print(res_json)

运行结果如下:

4、IronPython调用

首先我们需要把刚刚的虚拟环境,也就是env文件夹里的Lib文件夹,整个复制到我们的C#项目中,放到PythonScripts文件夹下。

然后打开该项目的csproj文件,添加如下配置:

<ItemGroup>
    <None Update="PythonScripts\Lib\**">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
</ItemGroup>

接着在main.py中添加上我们刚刚写的请求测试函数:

def GetReqTest():
    res = req.get('https://httpbin.org/basic-auth/user/pass', auth=('user', 'pass'))
    return res.text

最后在Program.cs中配置第三方库,并调用python的请求测试方法:

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
using System;

namespace IronPythonDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建python解释器
            var engine = Python.CreateEngine();

            SetSearchFile(ref engine);

            // 加载脚本文件
            dynamic py = engine.ExecuteFile(@"PythonScripts/main.py");
           
            // 调用requests库
            Console.WriteLine("Use Requests:");
            var resp = py.GetReqTest();
            Console.WriteLine(resp);

            Console.ReadKey();
        }

        /// <summary>
        /// 配置python第三方库路径
        /// </summary>
        /// <param name="engine"></param>
        private static void SetSearchFile(ref ScriptEngine engine)
        {
            var paths = engine.GetSearchPaths();
            paths.Add(@"PythonScripts\Lib");
            paths.Add(@"PythonScripts\Lib\site-packages");
            engine.SetSearchPaths(paths);
        }
    }
}

运行结果如下:

五、完整代码

1、Program.cs

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
using System;

namespace IronPythonDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建python解释器
            var engine = Python.CreateEngine();

            SetSearchFile(ref engine);

            // 加载脚本文件
            dynamic py = engine.ExecuteFile(@"PythonScripts/main.py");

            // 调用Python脚本的Test函数
            Console.WriteLine("Test:");
            var data = py.Test();
            Console.WriteLine(data);

            Console.WriteLine();

            // 查看IronPython的Python版本及使用的.NET版本
            Console.WriteLine("Python & .NET Version:");
            var version = py.SysVersion();
            Console.WriteLine(version);

            Console.WriteLine();

            // 使用Python的UUID标准库生成基于时间戳的UUID
            Console.WriteLine("Create UUID By Python:");
            var uuid = py.CreateUUID();
            Console.WriteLine(uuid.ToString());

            Console.WriteLine();

            // 调用requests库
            Console.WriteLine("Use Requests:");
            var resp = py.GetReqTest();
            Console.WriteLine(resp);

            Console.ReadKey();
        }

        /// <summary>
        /// 配置python第三方库路径
        /// </summary>
        /// <param name="engine"></param>
        private static void SetSearchFile(ref ScriptEngine engine)
        {
            var paths = engine.GetSearchPaths();
            paths.Add(@"PythonScripts\Lib");
            paths.Add(@"PythonScripts\Lib\site-packages");
            engine.SetSearchPaths(paths);
        }
    }
}

2、main.py

import sys
import uuid
import requests as req


def Test():
    return 'Hello IronPython!'


def SysVersion():
    return sys.version


def CreateUUID():
    return str(uuid.uuid1())


def GetReqTest():
    res = req.get('https://httpbin.org/basic-auth/user/pass', auth=('user', 'pass'))
    return res.text

六、结尾

使用IronPython包是C#调用Python的其中一种方法,它的优点就是可以将python和C#的代码都集成在一起,基础配置完成后,编写及修改代码都非常简单,无需为python代码进行多次打包。当然缺点就非常多了,比如由于Python版本限制,有部分常用的库无法使用、项目初始配置较为繁杂等。

IronPython的使用场景有很多,比如当我们需要进行爬虫的客户端开发的时候,我们就可以通过IronPython,使用C#进行高效美观的客户端开发,同时可以使用python进行高效的爬虫开发。

随着新需求的不断提出,总会出现某种语言无法满足需求或者开发成本偏高的情况,这种时候,我们就可以使用如IronPython这样的库,使用多语言进行开发,取长补短。

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

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

相关文章

音视频xxxx

文章目录前言编解码硬件解码(高级)软解码(低级)软、硬解码对比视频解码有四个步骤Android 系统中编解码器的命名方式查看当前设备支持的硬解码基础知识RGB色彩空间常见的格式对比YUV索引格式分离RGB24像素数据中的R、G、B分量BMP 文件格式格式组成像素排列顺序RGB24格式像素数据…

Apache Solr 9.1-(三)集群模式下通过Http API操作Apache Solr

Apache Solr 9.1-&#xff08;三&#xff09;集群模式下通过Http API操作Apache Solr Solr是一个基于Apache Lucene的搜索服务器&#xff0c;Apache Lucene是开源的、基于Java的信息检索库&#xff0c;Solr能为用户提供无论在任何时候都可以根据用户的查询请求返回结果&#xf…

网络原理(TCP/IP)(3)

4)滑动窗口 1)咱们滑动窗口的效果就是说在我们尽可能地保证可靠性的情况下&#xff0c;尽可能的提高传输效率2)况且咱们进行发送滑动窗口的本质就是说进行批量的发送数据&#xff0c;咱们尽可能说是把等待ACK的时间总体进行缩短&#xff0c;咱们可以把等待一份ACK的时间变成等待…

凸优化学习:PART1凸集

凸优化学习PART1 一、引言&#xff1a;优化问题简介 优化问题的定义 凸优化是优化的一种&#xff0c;是优化中比较容易的问题。在讲解优化问题前&#xff0c;首先说明什么是优化/数学规划&#xff08;Optimization/Mathematical Planning&#xff09;。 优化&#xff1a;从一…

搭建electron开发环境

electron是使用js,html,css构建桌面端应用程序的框架&#xff0c;可以使用electron开发Windows和Mac端应用。 安装nodejs,npm,cnpm 首先需要安装nodejs,npm和cnpm&#xff0c;安装后在命令行输入 node -v 和npm -v&#xff0c;如果输出了版本号&#xff0c;说明已经正常安装。…

数据仓库-数据模型建设方法总结(全)

一、大数据领域建模综述 1.1 为什么需要数据建模 有结构地分类组织和存储是我们面临的一个挑战。 数据模型强调从业务、数据存取和使用角度合理存储数据。 数据模型方法&#xff0c;以便在性能、成本、效率之间取得最佳平衡 成本&#xff1a;良好的数据模型能极大地减少不必…

MyBatis:批量添加记录

MyBatis&#xff0c;一款优秀的ORM映射框架&#xff0c;可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Java Objects&#xff0c;普通老式 Java 对象&#xff09;为数据库中的记录。同时&#xff0c;MyBatis提供了动态SQL特性&#x…

梦熊杯-十二月月赛-白银组题解-C.永恒

C. Problem C.永恒&#xff08;eternity.cpp&#xff09; 内存限制&#xff1a;256 MiB 时间限制&#xff1a;1000 ms 标准输入输出 题目类型&#xff1a;传统 评测方式&#xff1a;文本比较 题目描述: 「稻妻」是「永恒」的国度。 巴尔泽布认为&#xff0c;如果一个数…

感知机与门电路

前言&#xff1a;简述单层感知机特征及三种表示方式&#xff0c;并用单层感知机描述门电路&#xff0c;借由单层感知机无法处理非线性空间的问题&#xff0c;引出多层感知机。 单层感知机 感知机&#xff08;preceptron&#xff09;接收多个输入信号&#xff0c;输出一个信号…

【Kubernetes 企业项目实战】05、基于云原生分布式存储 Ceph 实现 K8s 数据持久化(上)

目录 一、分布式存储 Ceph 基本介绍 1.1 块存储&#xff08;rbd&#xff09; 1.2 文件系统 cephfs 1.3 对象存储 1.4 分布式存储的优点 二、Ceph 核心组件介绍 三、准备安装 Ceph 高可用集群的实验环境 3.1 机器配置 3.2 初始化环境 3.3 配置互信 3.4 配置 Ceph 安…

【精选博客】反爬过程中 x-ca-nonce、x-ca-signature 参数的解密过程

本篇博客在 请求头 x-ca-key、x-ca-nonce、x-ca-signature 加密分析第一篇 的基础上继续编写&#xff0c;大家学习时可以从上一篇入手。 文章目录x-ca-nonce 代码实现python 实现 uuidx-ca-signature代码实现在上一篇博客我们已经捕获了参数的JS代码&#xff0c;这篇博客重点要…

Java设计模式-策略模式Strategy

介绍 策略模式&#xff08;Strategy Pattern&#xff09;中&#xff0c;定义算法族&#xff08;策略组&#xff09;&#xff0c;分别封装起来&#xff0c;让他们之间可以互相替换&#xff0c;此模式让算法的变化独立于使用算法的客户。这算法体现了几个设计原则&#xff0c;第…

这些学习技巧学起来

技巧一&#xff1a;组合多个对象 在PPT页面插入多个图形后&#xff0c;想要移动这些元素时&#xff0c;很多小伙伴会挨个拖动进行位置调整。其实&#xff0c;我们大可以使用快捷键【CtrlG】将多个同类的元素进行组合&#xff0c;使其成为一个图形元素&#xff0c;这样就可以方…

springboot整合mybatis-plus及mybatis-plus分页插件的使用

springboot整合mybatis-plus及mybatis-plus分页插件的使用1. mybatis-plus?2. 引入依赖3. 编写配置文件4. 编写sql表5. mapper层5.1 mybatis-plus做了什么&#xff1f;及创建mapper接口5.2 baseMapper源码6. service层及controller层6.1 service层6.2 controller层6.2.1 page对…

【html】超链接样式

超链接样式超链接样式超链接样式 根据超链接的类型&#xff0c;显示不同图片的前缀 根据 <!doctype html> <html> <head> <meta charset"utf-8"> <title></title> <style type"text/css"> body {background: …

C# 托管堆遭破坏问题溯源分析

一&#xff1a;背景 1. 讲故事 年前遇到了好几例托管堆被损坏的案例&#xff0c;有些运气好一些&#xff0c;从被破坏的托管堆内存现场能观测出大概是什么问题&#xff0c;但更多的情况下是无法做出准确判断的,原因就在于生成的dump是第二现场&#xff0c;借用之前文章的一张…

Exynos4412 移植针对Samsung的Linux-6.1(四)NandFlash卡驱动

系列文章目录 Exynos4412 移植针对Samsung的Linux-6.1&#xff08;一&#xff09;下载、配置、编译Linux-6.1Exynos4412 移植针对Samsung的Linux-6.1&#xff08;二&#xff09;SD卡驱动——解决无法挂载SD卡的根文件系统Exynos4412 移植针对Samsung的Linux-6.1&#xff08;三…

C++基础——C++ 循环

C基础——C 循环C 循环循环类型循环控制语句无限循环C 循环 有的时候&#xff0c;可能需要多次执行同一块代码。一般情况下&#xff0c;语句是顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 编程语言提供了允许更为复杂…

计算机自动和声分析

思路&#xff1a;信号→和声 通过计算特征值&#xff08;特征向量&#xff09;区分音频的关键信息 Chroma特征向量 (32 条消息) 什么是 Chroma Features&#xff1f; - 知乎 (zhihu.com) 基本思想&#xff1a;音高听感的周期性 音高每高一个八度&#xff0c;就回到相似的听…

计算机相关专业提升学历的解决方案(博士研究生)

文章目录1、正规全日制博士1.1 申请 - 考核制1.2 硕博连读与直博2、继续教育&#xff08;非全日制&#xff09;2.1 在职博士2.2 同等学力申博3、海外博士3.1 海外博士3.2 中外合作博士博士录取政策 国内博士&#xff0c;没有具体的政策&#xff0c;招生权力下放到各个高校。 往…