Python是一種解釋型、面向對象、動態數據類型的高級程序設計語言。是一門動態解釋型語言,也是一門膠水語言,很方面調用其它編程語言的程序。比如:C/C++,C#等等。這里介紹一下Python和C#的互相調用。
IronPython?是一種在 .NET 及 Mono上的 Python 實現,由微軟的 Jim Hugunin 所發起,是一個開源的項目,基于微軟的 DLR 引擎。
IronPython是流行的程序設計語言Python通向.NET framework的一個端口。微軟公司對于.NET framework的IronPython和動態語言非常關注。微軟公司已經在各種項目中提供了對IronPython的支持。
IronPython已經很好的集成到了.NET framework中,Python語言中的字符串對應于.NET的字符串對象,并且Python語言中對應的方法,在IronPython中也都提供了。其它數據類型也是一樣。
IronPython-2.7.8經過了一年的制作,終于發布了。這將是第一個支持 .NET Core 的版本。一些詳情的更新內容,請點擊這里查看。
下載地址:
-
IronPython-2.7.8.msi
-
IronPython.2.7.8.zip
-
IronPython.StdLib.2.7.8.zip
-
Source code ?(zip)
-
Source code ?(tar.gz)
?
1.IronPython 調用 .NET 標準庫
在這里我們使用VS2019進行開發,新建一個IronPython項目:
?
如上圖創建一個IronPython 控制臺程序,命名為IronPythonTest 。在.NET中,有很多標準庫,在IronPython中,就可以使用import來引入這些標準庫來直接使用。看一個簡單的例子,我們使用.NET中的String和DateTime 。
上面寫一個簡單的Python腳本,通過 IronPython2.7 .exe 解釋器執行。如下圖:
2.IronPython調用 .NET? 自定義庫(DLL)
在.NET開發中,會經常通過References來引用一些.NET庫,當然在IronPython項目中,也可以引用并使用.NET庫。
例如,現在我們有一個Calc的計算類型,里面有一個Add和Sub方法。通過這個類型,生成了一個CalcLib.dll。R
?
namespace CalcLib
{
public class Calc
{
public int Add(int a, int b)
{
return a + b;
}
public int Sub(int a, int b)
{
return a - b;
}
}
}
?
下面看看如何在IronPython項目中使用這個dll,在IronPython中,可以使用"clr"模塊來添加.NET引用,將CalLib.dll編譯好,放在IronPython 工程目錄和執行腳本同一目錄下:
?
python腳本如下:
import clr
clr.AddReference('CalcLib')
#clr.AddReferenceToFile('CalcLib.dll')
from CalcLib import Calc
print dir(Calc)
calcObj = Calc()
print "result of 3+4 is:", calcObj.Add(3,4)
print "result of 10+2 is:", calcObj.Sub(10,2)
raw_input("press Enter to exit!")
IronPython解釋執行:
?
3.C#調用IronPython腳本
在.NET framework中,包含了IronPython的編譯器和執行引擎,所以我們可以通過C#代碼創建一個引擎實例,然后執行腳本。
先看看我們需要使用的類型:
- ScriptEngine: 動態語言(IronPython)執行類,可于解析和執行動態語言代碼。
- ScriptScope:構建一個執行上下文,其中保存了環境及全局變量;宿主(Host)可以通過創建不同的 ScriptScope 來提供多個數據隔離的執行上下文。
- ScriptSource:操控動態語言代碼的類型,可以編譯(Compile)、運行(Execute)代碼。
現在我們有一個簡單的打印當前時間的IronPython腳本:
from System import DateTime, String
formatStr = String.Format("{0} {1}", "Hello World! The current date and time is ", DateTime.Now)
print formatStr
#print dir(String)
raw_input("press Enter to exit!")
先進一個C#控制臺項目,引入IronPython庫:
using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Test
{
class Program
{
static void Main(string[] args)
{
try
{
ScriptEngine engine = Python.CreateEngine();
ScriptScope scope = engine.CreateScope();
ScriptSource script = engine.CreateScriptSourceFromFile(@"IronPythonTest.py");
var result = script.Execute(scope);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
將控制臺exe程序輸出到IronPython腳本同一目錄:
點擊運行,從C#程序調用了IronPython腳本(這里Exe必須和IronPython在同一目錄下,才可以成功調用)
4.從C#給IronPython傳遞參數
在ScriptScope類型中,有一個SetVariable方法,我們可以通過這個方法給腳本傳遞參數。
public void SetVariable(string name, object value)
這樣,我們就可以把一個C#實例傳遞給IronPython,然后腳本就可以使用C#實例的成員。看一個例子:
using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Test
{
public class Student
{
public int Age { get; set; }
public string Name { get; set; }
public override string ToString()
{
return string.Format("{0} is {1} years old", this.Name, this.Age);
}
}
class Program
{
static void Main(string[] args)
{
try
{
ScriptEngine engine = Python.CreateEngine();
ScriptScope scope = engine.CreateScope();
Student stu = new Student { Name = "deokoo", Age = 28 };
scope.SetVariable("stuObj",stu);
ScriptSource script = engine.CreateScriptSourceFromFile(@"IronPythonTest.py");
var result = script.Execute(scope);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
在這個例子中,C#代碼中創建了一個Student類型的實例,并把這個實例傳遞給了PrintStuInfo.py腳本:
from System import DateTime, String
formatStr = String.Format("{0} {1}", "Hello World! The current date and time is ", DateTime.Now)
print formatStr
#print dir(String)
print "Student name:", stuObj.Name
print "Student age:", stuObj.Age
print stuObj.ToString()
raw_input("press Enter to exit!")
通過輸出可以看到,IronPython腳本可以方便的訪問C#實例的成員:
總結
本篇文章通過一些例子演示了IronPython與C#的交互,感覺有幾個例子還是很有意思的。
有時候使用C#調用IronPython可以使程序變得更加靈活,通過一個C#類型提供一組封裝好的操作,每次構建類型實例然后傳遞給腳本;這樣,用戶就可以編寫IronPython腳本,然后使用C#類型中提供的操作方法,從而實現不同的自定義操作。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
