How can I redirect the stdout of IronPython in C#?

后端 未结 3 1725
情话喂你
情话喂你 2020-12-05 11:04

I have the following:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button3_Click(objec         


        
3条回答
  •  囚心锁ツ
    2020-12-05 12:00

    You can set a stream and a textwriter directly from c#:

    engine.Runtime.IO.SetOutput(stream, txtWriter);
    engine.Runtime.IO.SetErrorOutput(stream, txtWriter);
    

    To redirect the output for example you could override TextWriter class with a new one writing on your textbox.


    e.g.

    in my application I did an override of StreamWriter class that rises events when something is written on the stream (here just a part of the code):

    public class MyEvtArgs : EventArgs
    {
        public T Value
        {
            get;
            private set;
        }
        public MyEvtArgs(T value)
        {
            this.Value = value;
        }
    }
    
    
    public class EventRaisingStreamWriter : StreamWriter
    {
        #region Event
        public event EventHandler> StringWritten;
        #endregion
    
        #region CTOR
        public EventRaisingStreamWriter(Stream s):base(s)
        { }
        #endregion
    
        #region Private Methods
        private void LaunchEvent(string txtWritten)
        {
            if (StringWritten != null)
            {
                StringWritten(this, new MyEvtArgs(txtWritten));
            }
        }
        #endregion
    
    
        #region Overrides
    
        public override void Write(string value)
        {
            base.Write(value);
            LaunchEvent(value);
        }
        public override void Write(bool value)
        {
            base.Write(value);
            LaunchEvent(value.ToString());
        }
        // here override all writing methods...
    
        #endregion
    }
    

    Then in your application you should just do something like:

        MemoryStream ms = new MemoryStream();
    
        EventRaisingStreamWriter outputWr = new EventRaisingStreamWriter(ms);
        outputWr.StringWritten += new EventHandler>(sWr_StringWritten);
    
        var engine = Python.CreateEngine();
        engine.Runtime.IO.SetOutput(ms, outputWr);
        engine.CreateScriptSourceFromString("print 'hello world!'").Execute();
    
    
        void sWr_StringWritten(object sender, MyEvtArgs e)
        {
            textBox1.Text += e.Value;
        }
    

提交回复
热议问题