title: Redirect Python standard input/output to C# forms application
body: <p>I apologize if this is a duplicate question, I searched a bit and couldn't find anything similar - I have a Python library that connects to my C# application via a socket in order to allow simple Python scripting (IronPython isn't an option right now for a couple of reasons). I would like to create a Windows Forms control that would be basically a graphical front-end for the Python interpreter, so that the user could run the interpreter without having to have a separate console window open. </p>
  
  <p>I attached a simple demo of what I've tried so far below, but I haven't been able to get it to work. The DataReceived event handlers are never called, and when I try to write to the standard input nothing happens in the interpreter. Does anyone have any feedback about what I'm doing wrong, or if this is even possible?</p>
  
  <pre><code>public partial class Form1 : Form
  {
  
      Process _pythonProc;
  
      public Form1()
      {
          InitializeComponent();
      }
  
      private void Form1_Load(object sender, EventArgs e)
      {
          ProcessStartInfo psi = new ProcessStartInfo()
          {
              FileName = @"C:\Python26\Python.exe",
              CreateNoWindow = true,
              UseShellExecute = false,
              RedirectStandardInput = true,
              RedirectStandardOutput = true,
              RedirectStandardError = true
          };
          _pythonProc = new Process();
          _pythonProc.OutputDataReceived += OutputDataReceived;
          _pythonProc.ErrorDataReceived += ErrorDataReceived;
          _pythonProc.StartInfo = psi;
          _pythonProc.Start();
      }
  
      private void cmdExecute_Click(object sender, EventArgs e)
      {
          string cmd = textInput.Text;
          _pythonProc.StandardInput.WriteLine(cmd);
          _pythonProc.StandardInput.Flush();
          textInput.Text = string.Empty;
      }
  
      private void Form1_FormClosed(object sender, FormClosedEventArgs e)
      {
          if (!_pythonProc.HasExited)
              _pythonProc.Kill();
      }
  
      private void OutputDataReceived(object sender, DataReceivedEventArgs args)
      {
          textOutput.Text += args.Data;
      }
  
      private void ErrorDataReceived(object sender, DataReceivedEventArgs args)
      {
          textOutput.Text += args.Data;
      }
  
  }
  </code></pre>