網站首頁 編程語言 正文
一、前言
以下摘自百度百科:
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這樣的庫,使用多語言進行開發,取長補短。
原文鏈接:https://blog.csdn.net/XUMENGCAS/article/details/128784093
相關推薦
- 2022-09-15 C/C++?左移<<,?右移>>的作用及說明_C 語言
- 2022-04-28 Python字符串的創建和駐留機制詳解_python
- 2022-04-04 Python進制轉換用法詳解_python
- 2022-07-09 C#中的WebRequest與WebResponse抽象類、DNS靜態類、Ping類介紹_C#教程
- 2022-04-30 python的正則表達式和re模塊詳解_python
- 2022-03-26 Qt?多語言程序設計的實現_C 語言
- 2022-08-15 apollo配置中心的client端分析
- 2022-07-08 .NET?core項目AsyncLocal在鏈路追蹤中的應用_實用技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支