C#使用IronPython调用Python的实现

目录
  • 一、前言
  • 二、IronPython安装配置
  • 三、基础使用及标准库使用
    • 1、创建python脚本
    • 2、调用脚本
  • 四、IronPython调用第三方库
    • 1、创建python虚拟环境
    • 2、python虚拟环境安装requests库。
    • 3、使用requests
    • 4、IronPython调用
  • 五、完整代码
    • 1、Program.cs
    • 2、main.py
  • 六、结尾

一、前言

以下摘自百度百科:

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这样的库,使用多语言进行开发,取长补短。

到此这篇关于C#使用IronPython调用Python的实现的文章就介绍到这了,更多相关C# IronPython调用Python内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C#使用IronPython库调用Python脚本

    IronPython是一种在 .NET及 Mono上的 Python实现,由微软的 Jim Hugunin所发起,是一个开源的项目,基于微软的 DLR引擎. IronPython的主页: IronPython.net / github站点: IronLanguages/ironpython3: Implementation of Python 3.x for .NET Framework that is built on top of the Dynamic Language Runtime.

  • C#使用IronPython调用Python的实现

    目录 一.前言 二.IronPython安装配置 三.基础使用及标准库使用 1.创建python脚本 2.调用脚本 四.IronPython调用第三方库 1.创建python虚拟环境 2.python虚拟环境安装requests库. 3.使用requests 4.IronPython调用 五.完整代码 1.Program.cs 2.main.py 六.结尾 一.前言 以下摘自百度百科: IronPython 是一种在 NET 和 Mono 上实现的 Python 语言,由 Jim Hugunin

  • C#调用python文件执行

    我的电脑环境是使用.net framework4.5.1,如果在调试过程中调不通请注意 我用的是Visual studion 2017,python组件下载地址:http://ironpython.codeplex.com/releases/view/ 下载的版本是2.7,下载安装完之后记得引入安装路径下的以下三个dll (1)首先先说一个简单的功能,在c#代码中执行python字符串,内容如下: (2)c#调用python文件: 在当前目录下新建一个后缀名为py的文件,文件名为AmoutDis

  • C#调用Python脚本的简单示例

    IronPython是一种在 .NET及 Mono上的 Python实现,由微软的 Jim Hugunin所发起,是一个开源的项目,基于微软的 DLR引擎.IronPython的在CodePlex上的主页:http://ironpython.codeplex.com/ 使用场景: 如果你的小伙伴会写Python脚本,而且已经实现大部分项目的功能不需要再用C# 实现.现在缺少窗体,此时Python+C#的组合就可以完美的结局问题啦! 示例: 借由IronPython,就可以利用.NET执行存储在P

  • C#调用Python模块的方法

    当下,C#与Python都是比较热门的计算机编程语言,他们各有优缺点,如果能让他们互相配合工作,那是多么美好的事情,今天我来讲解一下如何利用C#来调用Python. 如果让C#支持调用Python模块,我们首先需要安装一些扩展,这里推荐使用IronPython库. 第一步,我们需要下载IronPython库的安装包,这里请大家移步官网http://ironpython.codeplex.com/,下载并安装相关库文件. 第二步,我们新建一个C#控制台测试项目,并将IronPython安装目录中的

  • 在VS2017中用C#调用python脚本的实现

    情景是这样的:在C#中调用python脚本进行post请求,python脚本中使用了requests包. Python的开发环境我们有比较多的选择,pycharm.sublime text等等.但是作为.net平台的Python语言ironPython,可以和C#交互,让编程更活泛. ironPython本身其实就是一个python的开发环境,我的电脑上还装有python2.7和pycharm,开始的时候使用pycharm写的,本来的想法是用VS直接调用就可以了.但是后来才明白这三者的关系. p

  • Python代码一键转Jar包及Java调用Python新姿势

    需求背景 进击的Python 随着人工智能的兴起,Python这门曾经小众的编程语言可谓是焕发了第二春. 以tensorflow.pytorch等为主的机器学习/深度学习的开发框架大行其道,助推了python这门曾经以爬虫见长(python粉别生气)的编程语言在TIOBE编程语言排行榜上一路披荆斩棘,坐上前三甲的宝座,仅次于Java和C,将C++.JavaScript.PHP.C#等一众劲敌斩落马下. 当然,轩辕君向来是不提倡编程语言之间的竞争对比,每一门语言都有自己的优势和劣势,有自己应用的领

  • C#调用Python程序传参数获得返回值

    目录 说明 1. Python 脚本 2. 打包成Windows可执行文件 3. C# 程序 4. 参考 说明 C# 调用 Python 程序有多种方式,本篇用的是第 4 种: nuget的ironPython: 用 c/c++ 调用python,再封装成库文件,c# 调用: c# 命令行调用.py文件执行: python 程序制作成 .exe 可执行文件,c# 使用命令行进行传参取返回值. 1. Python 脚本 先建个测试脚本 d://Test/EchoHi.py 代码如下: import

  • C# 如何调用python脚本

    目录 C#调用python脚本 方式一 方式二 方式三 方式四 方式五 C#调用python脚本 在平常工程项目开发过程中常常会涉及到机器学习.深度学习算法方面的开发任务,但是受限于程序设计语言本身的应用特点,该类智能算法的开发任务常常使用Python语言开发,所以在工程实践过程中常常会遇到多平台程序部署问题.本文总结了C#调用Python程序的各种方法,希望能够给各位读者提供一定的参考. 方式一 使用c#,nuget管理包上下载的ironPython安装包适用于python脚本中不包含第三方模

  • C#/.net程序调用Python的教程分享

    目录 C#调用python的常见方法 使用pythonnet 嵌入Python环境及使用第三方库 传递对象 调用pyd文件 执行速度对比 C#/.net程序调用python C#的优势在于window下的开发,不仅功能强大而且开发周期短.而python则有众多的第三方库,可以避免自己造轮子,利用C#来做界面,而具体实现使用python来实现可以大大提高开发效率.本文介绍如何使用pythonnet来执行python脚本,使用pythonnet既可以具有较高的交互性,又可以使用第三方python库,

随机推荐