欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用IronPython把Python腳本集成到.NET程序中的教程

 更新時(shí)間:2015年03月31日 11:04:55   作者:Jesse Smith  
這篇文章主要介紹了使用IronPython把Python腳本集成到.NET程序中的教程,現(xiàn)在剛剛被微軟開(kāi)源的.NET重新成為業(yè)界熱點(diǎn)、本文介紹了使Python和.NET交互的IronPython,需要的朋友可以參考下

從兩個(gè)優(yōu)秀的世界各取所需,更高效的復(fù)用代碼。想想就醉了,.NET和python融合了?!皯卸琛钡某绦騿T們,還等什么?

Jesse Smith為您展示如何兩個(gè)語(yǔ)言來(lái)服務(wù)同一個(gè).NET程序。你能集兩家所長(zhǎng):Python和.NET一起工作,提供可重用的代碼功能而不需要你為了一個(gè)環(huán)境重寫(xiě)代碼庫(kù)。

通過(guò)使用IronPython 運(yùn)行時(shí)庫(kù),你可以讓Python腳本運(yùn)行在你的.NET程序中。本文向你展示如何使用一個(gè).NET程序中的python腳本獲取并展示用戶反饋。

如果你曾經(jīng)有在一個(gè).NET程序中運(yùn)行Python腳本的需求,整合兩者最好的辦法是使用IronPython。我有過(guò)這樣的需求。我曾經(jīng)效力的一個(gè)組織需要擴(kuò)展一個(gè)已經(jīng)存在于一個(gè).NET地圖程序中的工具集。我們的目的是利用另一個(gè)工具集中現(xiàn)有的Python代碼來(lái)擴(kuò)展這個(gè)已有的工具集,前者還不是后者的一部分。在做了一番研究之后,我決定使用IronPython,事情進(jìn)展很順利。

本文基于上述項(xiàng)目的經(jīng)驗(yàn),我會(huì)還原當(dāng)時(shí)的場(chǎng)景,對(duì)你所處的情境也同樣適用。

對(duì)于這個(gè)我們所期望的解決方案,首先要面對(duì)的挑戰(zhàn)是從將要運(yùn)行在.NET程序中的那個(gè)Python腳本獲取輸出,然后使用一個(gè).NET程序的對(duì)話框把這個(gè)輸出展示給用戶。讓我感到吃驚的是,這么做比預(yù)想的還要簡(jiǎn)單,你同樣也能學(xué)到如何去做同樣的事情。整個(gè)過(guò)程相對(duì)比較簡(jiǎn)單,我們將在下面的章節(jié)中進(jìn)行概述。
在.NET程序中嵌入Python腳本

在這個(gè)例子中,我向你展示如何在一個(gè)Windows桌面程序中嵌入Python腳本。目的是在一個(gè)已有的程序中添加一個(gè)新的工具按鈕。點(diǎn)擊按鈕后,程序會(huì)彈出一個(gè)對(duì)話框,顯示一個(gè)嵌入在對(duì)話框代碼中的Python腳本的運(yùn)行結(jié)果。

為了給這個(gè)例子鋪墊更多的前因后果,我們這個(gè)應(yīng)用程序是一個(gè)桌面地圖軟件,可以讓用戶創(chuàng)建他們自己的地圖。這個(gè)新的工具允許用戶解析和標(biāo)準(zhǔn)化他們地圖上的地址點(diǎn)。

標(biāo)準(zhǔn)化一個(gè)地址,就意味著要確保這個(gè)地址有一個(gè)街道名,前綴或后綴,房屋或建筑編號(hào),以及連接該街道的上一條街道和下一條街道。每一個(gè)地址段必須遵循US郵局郵編地址標(biāo)準(zhǔn)指導(dǎo)。

假設(shè)已有一個(gè)Python腳本已經(jīng)可以做到這些;它就是例子中執(zhí)行解析的腳本。Python腳本將會(huì)通過(guò)當(dāng)前對(duì)話框在屏幕上輸出或閃現(xiàn)這個(gè)正在解析的地址,我們可以通過(guò)選擇地址解析工具來(lái)觸發(fā)對(duì)話框(我不想說(shuō)的太細(xì),僅僅解釋到這里。)

代碼并不重要,重要的是知道如何嵌入腳本和如何定向腳本的輸出到對(duì)話框,作為程序的一部分顯示在屏幕上。這一過(guò)程像下面這樣進(jìn)行:

  •     用戶啟動(dòng)地圖程序并打開(kāi)一個(gè)自定義地圖。
  •     用戶從屏幕上方的已有的工具集中選擇一個(gè)新的地址標(biāo)準(zhǔn)化工具。
  •     彈出一個(gè)帶有可以啟動(dòng)地址標(biāo)準(zhǔn)化進(jìn)程的啟動(dòng)按鈕的地址標(biāo)準(zhǔn)化對(duì)話框
  •     一個(gè)文本框顯示當(dāng)前正在被解析的地址。這些文本框很快消失,地址在用戶眼前一閃而過(guò),表示過(guò)程啟動(dòng)并且正在解析。
  •     出現(xiàn)一個(gè)表示整個(gè)過(guò)程結(jié)束的信息,使用了第4步中同樣的文本框。

確定源代碼和項(xiàng)目

首先要做的事情是確定腳本應(yīng)該嵌入到應(yīng)用程序源代碼的什么位置。在我們的例子/情境下,這個(gè)位置應(yīng)該是添加到包含工具集項(xiàng)目中的新的對(duì)話框。這個(gè)對(duì)話框會(huì)被一個(gè)已經(jīng)存在的用于處理工具欄點(diǎn)擊事件的方法所觸發(fā)

當(dāng)我們確定了需要包含源代碼的項(xiàng)目后,就需要引用IronPython 庫(kù)。

如果你使用Visual Studio作為編輯器的話,最簡(jiǎn)單的方法是使用Nuget Package Manager來(lái)添加IronPython庫(kù)到項(xiàng)目中。你可以搜索”IronPython”,然后運(yùn)行時(shí)庫(kù)就可以在包管理工具中選擇了。
嵌入腳本

接下來(lái)做的才是真正嵌入腳本。你首先要用腳本引擎(scripting engine)來(lái)設(shè)置一個(gè)Python腳本引擎實(shí)例。在添加腳本前,你同樣可以設(shè)置任何你的腳本所需的特殊的路徑。

 
ScriptEngine pyEngine = Python.CreateEngine();
pyEngine.Runtime.IO.RedirectToConsole();
var paths = pyEngine.GetSearchPaths();
paths.Add(@"C:Python27Lib");
paths.Add(@"C:Python27Libsite-packages");
pyEngine.SetSearchPaths(paths);

第二行告訴.NET框架Python引擎的運(yùn)行時(shí)庫(kù)會(huì)將輸出重定向到控制臺(tái)。然而,這并不是重定向到我們?yōu)檫@個(gè)應(yīng)用添加的新的工具所需的對(duì)話框中。(下面的代碼會(huì)做這個(gè)工作)

但是,首先我們需要通過(guò)一個(gè)簡(jiǎn)單的字符串變量來(lái)添加腳本。你需要改變你的腳本中的引號(hào)來(lái)配合字符串的引號(hào)工作。

一個(gè)簡(jiǎn)單的方法是把你腳本中的所有雙引號(hào)變成單引號(hào)。嵌入腳本的語(yǔ)法如下:

 
string thescript =
  @"
  (此處為實(shí)際腳本內(nèi)容)
  ";

你可能需要處理一些格式問(wèn)題,但是縮進(jìn)必須一致。在腳本字符串解析一個(gè)有效的字符串后,是時(shí)候添加輸出重定向代碼讓腳本的輸出顯示在工具的對(duì)話框窗口中了:

 
Console.SetOut(TextWriter.Synchronized(new TextBoxWriter(statusText)));
    pyEngine.Execute(thescript);
    this.AllDone(FINISHED);
   }
   catch (Exception ex)
   {
    this.AllDone(ex.InnerException.StackTrace);
   }
  }
  public void AllDone(string message)
  {
   buttonStart.Enabled = true;
   this.statusLabel.Text = message;
  }

在上面這段代碼中,我們?cè)O(shè)置了一個(gè)新的TextWriter,它接受一個(gè)TextBoxWriter類(lèi)型的參數(shù),這使得我們可以把腳本的輸出重新寫(xiě)到一個(gè)文本框中。TextBoxWriter類(lèi)型的代碼如下:
 

public class TextBoxWriter : TextWriter
  {
   private TextBox _textBox;
   public TextBoxWriter(TextBox textbox)
   {
    _textBox = textbox;
   }
   public override void Write(char value)
   {
    base.Write(value);
    // When character data is written, append it to the text box.
    _textBox.AppendText(value.ToString());
   }
   public override System.Text.Encoding Encoding
   {
    get { return System.Text.Encoding.UTF8; }
   }
  }
 }

傳入TextBoxWriter類(lèi)型的statusText屬性是我們的文本框,它會(huì)出現(xiàn)在對(duì)話框中,顯示腳本的輸出。我們的Python腳本中的每一個(gè)輸出語(yǔ)句都會(huì)被重定向到這個(gè)文本框。
結(jié)論

在本文中,你學(xué)會(huì)了如何把Python腳本集成到一個(gè).NET程序中,并且把Python的腳本文件輸出到一個(gè).NET對(duì)話框。這種無(wú)縫銜接,用戶是不會(huì)感覺(jué)到的,他們并不知道實(shí)際上是Python在處理后臺(tái)的一些工作。

在很多場(chǎng)合下,集成兩種語(yǔ)言是很有用的。我分享了的這一情景,為我的處境提供了很好的解決方案。你可以按照類(lèi)似的步驟,用同樣的方法把它應(yīng)用在很多場(chǎng)合。

我建議你去建立一個(gè)自己的簡(jiǎn)單范例,甚至使用Python腳本文件把Python代碼直接加入到.NET應(yīng)用中,你確實(shí)可以這樣做。當(dāng)然你并不需要直接把腳本嵌入在.NET源代碼中,但對(duì)我來(lái)說(shuō)這樣做最方便。

相關(guān)文章

  • Python 如何求矩陣的逆

    Python 如何求矩陣的逆

    這篇文章主要介紹了Python 如何求矩陣的逆案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • Flask實(shí)現(xiàn)圖片的上傳、下載及展示示例代碼

    Flask實(shí)現(xiàn)圖片的上傳、下載及展示示例代碼

    這篇文章主要介紹了Flask實(shí)現(xiàn)圖片的上傳、下載及展示示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • python中的json模塊常用方法匯總

    python中的json模塊常用方法匯總

    這篇文章主要介紹了python中的json模塊常用方法匯總,json模塊可以實(shí)現(xiàn)json數(shù)據(jù)的序列化和反序列化,更多相關(guān)資料介紹需要的小伙伴可以參考一下下面文章內(nèi)容
    2022-06-06
  • 最新評(píng)論