将Ironpython输出流式传输到我的编辑器

时间:2010-01-18 23:31:34

标签: ironpython

我们在应用程序sob中嵌入了ironpython,脚本可以在我们的应用程序环境中执行。

我使用Python.CreateEngine()和ScriptScope.Execute()来执行python脚本。

我们有自己的编辑器(用C#编写)可以加载ironpython脚本并运行它。

我需要解决两个问题。

  1. 如果我在ironpython脚本中有一个print语句,我怎样才能将它显示给我的编辑器(我将如何告诉python引擎将输出重定向到我的C#代码中的某个处理程序)

  2. 我计划使用unittest.py来运行unittest。当我运行以下 runner = unittest.TextTestRunner() runner.run(测试包)

  3. 输出被重定向到标准输出,但需要一种方法将其重定向到我的C#编辑器输出窗口,以便用户可以看到结果。 这个问题可能与1

    有关

    感谢任何帮助 ģ

3 个答案:

答案 0 :(得分:6)

您可以提供将用于所有输出的自定义Stream或TextWriter。您可以使用ScriptRuntime.IO.SetOutput重载之一来提供这些。您的Stream或TextWriter实现应该接收字符串然后将它们输出到您的编辑器窗口(如果您在第二个执行线程上运行脚本,则可能会编组回UI线程)。

答案 1 :(得分: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控件(如文本框),您需要创建自己的流并让它实现一个可以打印到文本框的Write方法。

答案 2 :(得分:2)

首先,您需要将引擎输出重定向到控制台



    engine.Runtime.IO.RedirectToConsole();

然后,您需要将NET控制台输出重定向到自定义TextBox TextWriter。 在这里,您的TextBox是txtBoxTarget



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

最后,您需要实现自定义TextBox 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; }
        }
    }  
}

简单,真的。