一、前言
以下摘自百度百科:
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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!