【问题标题】:Streaming Ironpython output to my editor将 Ironpython 输出流式传输到我的编辑器
【发布时间】:2010-01-18 23:31:34
【问题描述】:

我们在应用程序中嵌入了 ironpython,希望脚本可以在应用程序的上下文中执行。

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

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

我需要解决 2 个问题。

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

  2. 我计划使用 unittest.py 来运行 unittest。当我运行以下 跑步者 = unittest.TextTestRunner() runner.run(testsuite)

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

任何帮助表示赞赏 G

【问题讨论】:

    标签: ironpython


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这是一个用于将输出发送到文件的 sn-p。

             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 方法。

      【讨论】:

        【解决方案3】:

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

        
        
            engine.Runtime.IO.RedirectToConsole();
        
        

        然后您需要将 NET Console Out 重定向到自定义 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; }
                }
            }  
        }
        

        简单,真的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-01
          • 2019-07-10
          • 1970-01-01
          • 2013-05-11
          相关资源
          最近更新 更多