2010-01-18 141 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; } 
     } 
    } 
} 

简单,真的。