Further fun hosting IronPython


When I first got my Python host working, I could type expressions and they would run…but I couldn’t see the output.  I had to dig a little bit, but found that Python was sending its output to sys.stdout, which at startup is set to a PythonFile wrapping .NET’s Console.  To get what I wanted, I need to set sys.stdout to go back to my TextBox.  To do this I added a couple of lines you’ve already seen.  In the ConsolePane class, I wrote this:


TextBoxStream stream = new TextBoxStream(this.textBox);


this.processor = new PythonProcessor(stream);


and then in the PythonProcessor ctor, I set stdout:


sys.stdout = new PythonFile(outputStream, “w”, false);


Then things worked nicely.  Of course I had to write the TextBoxStream class.  Fortunately, it only needed to write.  Here’s that code:

namespace AddInConsole
{
using System;
using System.Globalization;
using System.IO;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
class TextBoxStream : Stream
{
private TextBox textBox = null;
public TextBoxStream(TextBox textBox)
{
this.textBox = textBox;
}

public override bool CanRead
{
get { return false; }
}

public override bool CanSeek
{
get { return false; }
}

public override bool CanWrite
{
get { return true; }
}

public override void Flush()
{
// Do nothing
}

public override long Length
{
get { return this.textBox.Text.Length; }
}

public override long Position
{
get
{
return this.textBox.CaretIndex;
}
set
{
throw new NotImplementedException(“The method or operation is not implemented.”);
}
}

public override int Read(byte[] buffer, int offset, int count)
{
throw new NotImplementedException(“Read not implemented”);
}

public override long Seek(long offset, SeekOrigin origin)
{
throw new NotImplementedException(“The method or operation is not implemented.”);
}

public override void SetLength(long value)
{
throw new NotImplementedException(“The method or operation is not implemented.”);
}

public override void Write(byte[] buffer, int offset, int count)
{
// IronPython uses Encoding.ASCII to write to a stream…so we’ll pull it back out
// the same way
byte[] convertBuffer = new byte[count];
Array.Copy(buffer, offset, convertBuffer, 0, count);
string output = Encoding.ASCII.GetString(convertBuffer);
this.textBox.AppendText(output);
}
}
}


Comments (1)