python實戰技能:使用IronPython把Python腳本集成到.NET程序中的教程

@本文來源於公衆號:csdn2299,喜歡可以關注公衆號 程序員學府
這篇文章主要介紹了使用IronPython把Python腳本集成到.NET程序中的教程,現在剛剛被微軟開源的.NET重新成爲業界熱點、本文介紹了使Python和.NET交互的IronPython,需要的朋友可以參考下
從兩個優秀的世界各取所需,更高效的複用代碼。想想就醉了,.NET和python融合了。“懶惰”的程序員們,還等什麼?

Jesse Smith爲您展示如何兩個語言來服務同一個.NET程序。你能集兩家所長:Python和.NET一起工作,提供可重用的代碼功能而不需要你爲了一個環境重寫代碼庫。

通過使用IronPython 運行時庫,你可以讓Python腳本運行在你的.NET程序中。本文向你展示如何使用一個.NET程序中的python腳本獲取並展示用戶反饋。

如果你曾經有在一個.NET程序中運行Python腳本的需求,整合兩者最好的辦法是使用IronPython。我有過這樣的需求。我曾經效力的一個組織需要擴展一個已經存在於一個.NET地圖程序中的工具集。我們的目的是利用另一個工具集中現有的Python代碼來擴展這個已有的工具集,前者還不是後者的一部分。在做了一番研究之後,我決定使用IronPython,事情進展很順利。

本文基於上述項目的經驗,我會還原當時的場景,對你所處的情境也同樣適用。

對於這個我們所期望的解決方案,首先要面對的挑戰是從將要運行在.NET程序中的那個Python腳本獲取輸出,然後使用一個.NET程序的對話框把這個輸出展示給用戶。讓我感到吃驚的是,這麼做比預想的還要簡單,你同樣也能學到如何去做同樣的事情。整個過程相對比較簡單,我們將在下面的章節中進行概述。

在.NET程序中嵌入Python腳本

在這個例子中,我向你展示如何在一個Windows桌面程序中嵌入Python腳本。目的是在一個已有的程序中添加一個新的工具按鈕。點擊按鈕後,程序會彈出一個對話框,顯示一個嵌入在對話框代碼中的Python腳本的運行結果。

爲了給這個例子鋪墊更多的前因後果,我們這個應用程序是一個桌面地圖軟件,可以讓用戶創建他們自己的地圖。這個新的工具允許用戶解析和標準化他們地圖上的地址點。

標準化一個地址,就意味着要確保這個地址有一個街道名,前綴或後綴,房屋或建築編號,以及連接該街道的上一條街道和下一條街道。每一個地址段必須遵循US郵局郵編地址標準指導。

假設已有一個Python腳本已經可以做到這些;它就是例子中執行解析的腳本。Python腳本將會通過當前對話框在屏幕上輸出或閃現這個正在解析的地址,我們可以通過選擇地址解析工具來觸發對話框(我不想說的太細,僅僅解釋到這裏。)

代碼並不重要,重要的是知道如何嵌入腳本和如何定向腳本的輸出到對話框,作爲程序的一部分顯示在屏幕上。這一過程像下面這樣進行:

用戶啓動地圖程序並打開一個自定義地圖。
用戶從屏幕上方的已有的工具集中選擇一個新的地址標準化工具。
彈出一個帶有可以啓動地址標準化進程的啓動按鈕的地址標準化對話框
一個文本框顯示當前正在被解析的地址。這些文本框很快消失,地址在用戶眼前一閃而過,表示過程啓動並且正在解析。
出現一個表示整個過程結束的信息,使用了第4步中同樣的文本框。

確定源代碼和項目

首先要做的事情是確定腳本應該嵌入到應用程序源代碼的什麼位置。在我們的例子/情境下,這個位置應該是添加到包含工具集項目中的新的對話框。這個對話框會被一個已經存在的用於處理工具欄點擊事件的方法所觸發

當我們確定了需要包含源代碼的項目後,就需要引用IronPython 庫。

如果你使用Visual Studio作爲編輯器的話,最簡單的方法是使用Nuget Package Manager來添加IronPython庫到項目中。你可以搜索”IronPython”,然後運行時庫就可以在包管理工具中選擇了。
嵌入腳本

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

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引擎的運行時庫會將輸出重定向到控制檯。然而,這並不是重定向到我們爲這個應用添加的新的工具所需的對話框中。(下面的代碼會做這個工作)

但是,首先我們需要通過一個簡單的字符串變量來添加腳本。你需要改變你的腳本中的引號來配合字符串的引號工作。

一個簡單的方法是把你腳本中的所有雙引號變成單引號。嵌入腳本的語法如下:

string thescript =
  @"
  (此處爲實際腳本內容)
  ";

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

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;
  }

在上面這段代碼中,我們設置了一個新的TextWriter,它接受一個TextBoxWriter類型的參數,這使得我們可以把腳本的輸出重新寫到一個文本框中。TextBoxWriter類型的代碼如下:

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類型的statusText屬性是我們的文本框,它會出現在對話框中,顯示腳本的輸出。我們的Python腳本中的每一個輸出語句都會被重定向到這個文本框。
結論

在本文中,你學會了如何把Python腳本集成到一個.NET程序中,並且把Python的腳本文件輸出到一個.NET對話框。這種無縫銜接,用戶是不會感覺到的,他們並不知道實際上是Python在處理後臺的一些工作。

在很多場合下,集成兩種語言是很有用的。我分享了的這一情景,爲我的處境提供了很好的解決方案。你可以按照類似的步驟,用同樣的方法把它應用在很多場合。
我建議你去建立一個自己的簡單範例,甚至使用Python腳本文件把Python代碼直接加入到.NET應用中,你確實可以這樣做。當然你並不需要直接把腳本嵌入在.NET源代碼中,但對我來說這樣做最方便。
非常感謝你的閱讀
大學的時候選擇了自學python,工作了發現吃了計算機基礎不好的虧,學歷不行這是

沒辦法的事,只能後天彌補,於是在編碼之外開啓了自己的逆襲之路,不斷的學習python核心知識,深

入的研習計算機基礎知識,整理好了,我放在我們的微信公衆號《程序員學府》,如果你也不甘平庸,

那就與我一起在編碼之外,不斷成長吧!

其實這裏不僅有技術,更有那些技術之外的東西,比如,如何

做一個精緻的程序員,而不是“屌絲”,程序員本身就是高貴的一種存在啊,難道不是嗎?點擊加入
想做你自己想成爲高尚人,加油!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章