我们在应用程序sob中嵌入了ironpython,脚本可以在我们的应用程序环境中执行。
我使用Python.CreateEngine()和ScriptScope.Execute()来执行python脚本。
我们有自己的编辑器(用C#编写)可以加载ironpython脚本并运行它。
我需要解决两个问题。
如果我在ironpython脚本中有一个print语句,我怎样才能将它显示给我的编辑器(我将如何告诉python引擎将输出重定向到我的C#代码中的某个处理程序)
我计划使用unittest.py来运行unittest。当我运行以下 runner = unittest.TextTestRunner() runner.run(测试包)
输出被重定向到标准输出,但需要一种方法将其重定向到我的C#编辑器输出窗口,以便用户可以看到结果。 这个问题可能与1
有关感谢任何帮助 ģ
答案 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; }
}
}
}
简单,真的。