2010-01-18 53 views
4

我們在我們的應用程序中嵌入了ironpython sob,腳本可以在我們的應用程序中執行。將Ironpython輸出到我的編輯器

我使用Python.CreateEngine()和ScriptScope.Execute()來執行python腳本。

我們有自己的編輯器(用C#編寫)可以加載ironpython腳本並運行它。

我需要解決2個問題。

  1. 如果我在IronPython的腳本print語句,我怎麼能證明是我的編輯器(我怎麼會告訴蟒蛇發動機輸出到一些處理重定向在我的C#代碼)

  2. 我打算使用unittest.py來運行unittest。當我運行以下 亞軍= unittest.TextTestRunner() runner.run(測試套件)

輸出重定向到標準輸出,但需要一種方式,它被重定向到我的C#編輯器輸出窗口,該用戶可以看到結果。 這個問題可能與1

任何幫助表示讚賞 摹

回答

6

可以提供將被用於所有輸出的自定義流或TextWriter的。您可以通過使用ScriptRuntime.IO.SetOutput重載之一來提供。您的Stream或TextWriter的實現應該接收這些字符串,然後將它們輸出到您的編輯器窗口(如果您在第二個執行線程上運行該腳本,可能將其編組回到UI線程中)。

3

下面是將輸出發送到文件的代碼片段。

 System.IO.FileStream fs = new System.IO.FileStream("c:\\temp\\ipy.log", System.IO.FileMode.Create); 
     engine.Runtime.IO.SetOutput(fs, Encoding.ASCII); 

用於發送GUI的UI控件,如一個文本框,你需要創建自己的數據流,並將它落實,將打印到文本框中寫入方法。

2

首先,你需要發動機輸出重定向到控制檯



    engine.Runtime.IO.RedirectToConsole(); 

然後,你需要輸出重定向NET控制檯自定義文本框的TextWriter。 在這裏,你的文本框是txtBoxTarget



    // set application console output to the output text box 
    Console.SetOut(TextWriter.Synchronized(new TextBoxWriter(txtBoxTarget))); 

最後,你需要實現自定義文本框的TextWriter。

using System; 
using System.IO; 
using System.Windows.Forms; 

namespace PythonScripting.TestApp 
{ 
    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; } 
     } 
    } 
} 

簡單,真的。