C#使用IronPython調(diào)用Python的實(shí)現(xiàn)
一、前言
以下摘自百度百科:
IronPython 是一種在 NET 和 Mono 上實(shí)現(xiàn)的 Python 語(yǔ)言,由 Jim Hugunin(同時(shí)也是 Jython 創(chuàng)造者)所創(chuàng)造。1.0 版于2006年9月5日發(fā)布。
隨后,在 2007 年,開(kāi)發(fā)者決定改寫(xiě)架構(gòu),使用動(dòng)態(tài)類(lèi)型系統(tǒng)以讓更多腳本語(yǔ)言能很容易地移植到NET Framework上。2008 年,隨著微軟發(fā)布 NET Framework3.0/3.5、Silverlight 之后, IronPython也發(fā)布了 2.0 版,最新版本是 2.7,于 2011年3月發(fā)布,支持.NET Framework 4.0。
我們可以把IronPython理解為在.NET平臺(tái)上實(shí)現(xiàn)的python解釋器,我們可以使用IronPython進(jìn)行python腳本的調(diào)用,也可以反過(guò)來(lái),使用IronPython調(diào)用C#的功能。
目前IronPython支持兩個(gè)python版本,python2.7及python3.4,可根據(jù)自己實(shí)際需要進(jìn)行版本選擇。最新版本為支持python3.4的3.4版本,支持的.NET最低版本為.NET Framework4.6.2,也可在.NET Core、.NET5、.NET6上使用。
IronPython官網(wǎng):https://ironpython.net。
本文將以.NET5的控制臺(tái)應(yīng)用程序,實(shí)際演示通過(guò)IronPython在C#中調(diào)用Python腳本。
本文源代碼已上傳至GitHub,鏈接如下:
https://github.com/XMNHCAS/IronPythonDemo
二、IronPython安裝配置
打開(kāi)Nuget管理工具,搜索IronPython,如下圖所示:
不需要調(diào)用任何包的情況下,只安裝第一個(gè)即可。
IronPython.StdLib是Python標(biāo)準(zhǔn)庫(kù),如果需要調(diào)用標(biāo)準(zhǔn)庫(kù)則需要安裝這個(gè)包。安裝完成后,如果程序編譯之后不將此包的文件復(fù)制至編譯環(huán)境,則需要在項(xiàng)目的csproj文件中添加以下配置項(xiàng):
<ItemGroup> <Content Include="lib\**"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup> <ItemGroup> <None Update="lib\**"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>
ps:使用此庫(kù),推薦安裝VS的Python支持,否則可能會(huì)出現(xiàn)編譯失敗的情況。
三、基礎(chǔ)使用及標(biāo)準(zhǔn)庫(kù)使用
1、創(chuàng)建python腳本
項(xiàng)目創(chuàng)建完成后,在項(xiàng)目中添加一個(gè)文件夾,此處命名為“PythonScripts”,此文件夾用于放置所有python腳本以及第三方庫(kù)。創(chuàng)建完成后,在此文件夾中添加一個(gè)main.py文件,用以編寫(xiě)我們的python示例腳本。
在main.py中添加以下函數(shù),然后把文件屬性的“復(fù)制到輸出目錄”一項(xiàng)改為“如果較新則復(fù)制”。
此示例調(diào)用了python的uuid標(biāo)準(zhǔn)庫(kù),所以需要安裝前文提及的“IronPython.StdLib”包。
import sys import uuid def Test(): return 'Hello IronPython!' def SysVersion(): return sys.version def CreateUUID(): return str(uuid.uuid1())
2、調(diào)用腳本
在Program.cs文件中,修改Main函數(shù):
using IronPython.Hosting; using System; namespace IronPythonDemo { class Program { static void Main(string[] args) { // 創(chuàng)建python解釋器 var engine = Python.CreateEngine(); // 加載腳本文件 dynamic py = engine.ExecuteFile(@"PythonScripts/main.py"); // 調(diào)用Python腳本的Test函數(shù) 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標(biāo)準(zhǔn)庫(kù)生成基于時(shí)間戳的UUID Console.WriteLine("Create UUID By Python:"); var uuid = py.CreateUUID(); Console.WriteLine(uuid.ToString()); Console.ReadKey(); } } }
運(yùn)行結(jié)果如下:
四、IronPython調(diào)用第三方庫(kù)
IronPython調(diào)用python第三方庫(kù),需要將調(diào)用的第三方庫(kù)文件拷貝至輸出目錄,并使用IronPython加載。由于IronPython目前支持的python版本是2.7及3.4,所以需要注意第三方庫(kù)的版本,根據(jù)實(shí)際需要選擇IronPython可支持的庫(kù)版本。
由于需要復(fù)制第三方庫(kù)的文件,建議創(chuàng)建單獨(dú)的python項(xiàng)目并配置虛擬環(huán)境,以便python腳本的函數(shù)測(cè)試以及后續(xù)的文件拷貝。
以下以調(diào)用requests庫(kù)為例,示范IronPython如何調(diào)用第三方庫(kù)。
1、創(chuàng)建python虛擬環(huán)境
在需要?jiǎng)?chuàng)建虛擬環(huán)境的目錄下,打開(kāi)cmd,并運(yùn)行以下命令。
注意:python版本應(yīng)為3.4,如果本地存在多個(gè)版本的解釋器,請(qǐng)將命令中的python改為3.4的版本的python.exe路徑。
python -m venv env
創(chuàng)建完成后,就會(huì)出現(xiàn)一個(gè)env的文件夾,這個(gè)文件夾就是我們的虛擬環(huán)境了。
2、python虛擬環(huán)境安裝requests庫(kù)。
由于我們使用的IronPython支持的python版本是3.4,所以我們安裝的requests庫(kù)也應(yīng)該是支持python3.4的版本,如2.15.1。
首先要運(yùn)行以下命令,啟動(dòng)虛擬環(huán)境:
env\Scripts\activate.bat
然后使用pip安裝requests 2.15.1:
pip install requests==2.15.1
如下圖所示:
3、使用requests
我們可以請(qǐng)求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)
運(yùn)行結(jié)果如下:
4、IronPython調(diào)用
首先我們需要把剛剛的虛擬環(huán)境,也就是env文件夾里的Lib文件夾,整個(gè)復(fù)制到我們的C#項(xiàng)目中,放到PythonScripts文件夾下。
然后打開(kāi)該項(xiàng)目的csproj文件,添加如下配置:
<ItemGroup> <None Update="PythonScripts\Lib\**"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>
接著在main.py中添加上我們剛剛寫(xiě)的請(qǐng)求測(cè)試函數(shù):
def GetReqTest(): res = req.get('https://httpbin.org/basic-auth/user/pass', auth=('user', 'pass')) return res.text
最后在Program.cs中配置第三方庫(kù),并調(diào)用python的請(qǐng)求測(cè)試方法:
using IronPython.Hosting; using Microsoft.Scripting.Hosting; using System; namespace IronPythonDemo { class Program { static void Main(string[] args) { // 創(chuàng)建python解釋器 var engine = Python.CreateEngine(); SetSearchFile(ref engine); // 加載腳本文件 dynamic py = engine.ExecuteFile(@"PythonScripts/main.py"); // 調(diào)用requests庫(kù) Console.WriteLine("Use Requests:"); var resp = py.GetReqTest(); Console.WriteLine(resp); Console.ReadKey(); } /// <summary> /// 配置python第三方庫(kù)路徑 /// </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); } } }
運(yùn)行結(jié)果如下:
五、完整代碼
1、Program.cs
using IronPython.Hosting; using Microsoft.Scripting.Hosting; using System; namespace IronPythonDemo { class Program { static void Main(string[] args) { // 創(chuàng)建python解釋器 var engine = Python.CreateEngine(); SetSearchFile(ref engine); // 加載腳本文件 dynamic py = engine.ExecuteFile(@"PythonScripts/main.py"); // 調(diào)用Python腳本的Test函數(shù) 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標(biāo)準(zhǔn)庫(kù)生成基于時(shí)間戳的UUID Console.WriteLine("Create UUID By Python:"); var uuid = py.CreateUUID(); Console.WriteLine(uuid.ToString()); Console.WriteLine(); // 調(diào)用requests庫(kù) Console.WriteLine("Use Requests:"); var resp = py.GetReqTest(); Console.WriteLine(resp); Console.ReadKey(); } /// <summary> /// 配置python第三方庫(kù)路徑 /// </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
六、結(jié)尾
使用IronPython包是C#調(diào)用Python的其中一種方法,它的優(yōu)點(diǎn)就是可以將python和C#的代碼都集成在一起,基礎(chǔ)配置完成后,編寫(xiě)及修改代碼都非常簡(jiǎn)單,無(wú)需為python代碼進(jìn)行多次打包。當(dāng)然缺點(diǎn)就非常多了,比如由于Python版本限制,有部分常用的庫(kù)無(wú)法使用、項(xiàng)目初始配置較為繁雜等。
IronPython的使用場(chǎng)景有很多,比如當(dāng)我們需要進(jìn)行爬蟲(chóng)的客戶(hù)端開(kāi)發(fā)的時(shí)候,我們就可以通過(guò)IronPython,使用C#進(jìn)行高效美觀(guān)的客戶(hù)端開(kāi)發(fā),同時(shí)可以使用python進(jìn)行高效的爬蟲(chóng)開(kāi)發(fā)。
隨著新需求的不斷提出,總會(huì)出現(xiàn)某種語(yǔ)言無(wú)法滿(mǎn)足需求或者開(kāi)發(fā)成本偏高的情況,這種時(shí)候,我們就可以使用如IronPython這樣的庫(kù),使用多語(yǔ)言進(jìn)行開(kāi)發(fā),取長(zhǎng)補(bǔ)短。
到此這篇關(guān)于C#使用IronPython調(diào)用Python的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C# IronPython調(diào)用Python內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#紋理畫(huà)刷TextureBrush用法實(shí)例
這篇文章主要介紹了C#紋理畫(huà)刷TextureBrush用法,實(shí)例分析了紋理畫(huà)刷TextureBrush的具體使用技巧,需要的朋友可以參考下2015-06-06C# 16進(jìn)制與字符串、字節(jié)數(shù)組之間的轉(zhuǎn)換
在串口通訊過(guò)程中,經(jīng)常要用到 16進(jìn)制與字符串、字節(jié)數(shù)組之間的轉(zhuǎn)換2009-05-05C#實(shí)現(xiàn)通過(guò)ffmpeg從flv視頻文件中截圖的方法
這篇文章主要介紹了C#實(shí)現(xiàn)通過(guò)ffmpeg從flv視頻文件中截圖的方法,實(shí)例分析了C#使用ffmpeg操作flv文件的技巧,需要的朋友可以參考下2015-03-03C#數(shù)據(jù)結(jié)構(gòu)之堆棧(Stack)實(shí)例詳解
這篇文章主要介紹了C#數(shù)據(jù)結(jié)構(gòu)之堆棧(Stack),結(jié)合實(shí)例形式較為詳細(xì)的分析了堆棧的原理與C#實(shí)現(xiàn)堆棧功能的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11C# string格式的日期時(shí)間字符串轉(zhuǎn)為DateTime類(lèi)型的方法
這篇文章主要介紹了C# string格式的日期時(shí)間字符串轉(zhuǎn)為DateTime類(lèi)型的方法,需要的朋友可以參考下2017-02-02C# linq查詢(xún)之動(dòng)態(tài)OrderBy用法實(shí)例
這篇文章主要介紹了C# linq查詢(xún)之動(dòng)態(tài)OrderBy用法,實(shí)例分析了C#采用linq方式查詢(xún)時(shí)動(dòng)態(tài)排序的相關(guān)技巧,需要的朋友可以參考下2015-06-06C# 批量生成隨機(jī)密碼必須包含數(shù)字和字母并用加密算法加密
這篇文章主要介紹了C# 批量生成隨機(jī)密碼必須包含數(shù)字和字母并用加密算法加密,需要的朋友參考下2017-01-01使用Spire.Barcode程序庫(kù)生成二維碼的實(shí)例解析
這篇文章主要介紹了使用Spire.Barcode程序庫(kù)生成二維碼的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12C#檢測(cè)是否有危險(xiǎn)字符的SQL字符串過(guò)濾方法
這篇文章主要介紹了C#檢測(cè)是否有危險(xiǎn)字符的SQL字符串過(guò)濾方法,功能非常實(shí)用,對(duì)于程序設(shè)計(jì)的安全來(lái)說(shuō)至關(guān)重要!需要的朋友可以參考下2014-07-07