2013-03-01 57 views
0

我想创建一个实现python控制台的控件。不幸的是,它没有收到任何Python输出。在C中的Python控制台#

Queue<string> qstring = new Queue<string>(); 
    Thread thread; 
    Process prc; 
    void pythonmain() 
    { 
     if (DesignMode) return; 
     prc = new Process(); 
     prc.StartInfo.FileName = "python"; 
     prc.StartInfo.Arguments = " -u"; 
     prc.StartInfo.RedirectStandardInput = true; 
     prc.StartInfo.RedirectStandardOutput = true; 
     prc.StartInfo.RedirectStandardError = true; 
     prc.StartInfo.UseShellExecute = false; 
     prc.StartInfo.CreateNoWindow = true; 

     prc.EnableRaisingEvents = true; 
     prc.OutputDataReceived += new DataReceivedEventHandler(prc_OutputDataReceived); 
     prc.ErrorDataReceived += new DataReceivedEventHandler(prc_ErrorDataReceived); 
     prc.SynchronizingObject = this; 

     prc.Start(); 
     prc.BeginOutputReadLine(); 
     prc.BeginErrorReadLine(); 




     while (!prc.HasExited) 
     { 
      lock (qstring) 
      { 
       if (qstring.Count > 0) prc.StandardInput.Write(qstring.Dequeue()+"\n"); 
      } 
     } 


     prc.WaitForExit(); 
    } 

    void prc_ErrorDataReceived(object sender, DataReceivedEventArgs e) 
    { 
     if (e.Data != null) 
     { 
      richTextBox1.BeginInvoke(new Action<string>((s) => richTextBox1.AppendText(s)),e.Data); 
     } 
    } 

    void prc_OutputDataReceived(object sender, DataReceivedEventArgs e) 
    { 
     System.Diagnostics.Process p = (Process)sender; 

     if (e.Data != null) 
     { 
      richTextBox1.BeginInvoke(new Action<string>((s) => richTextBox1.AppendText(s)), e.Data); 
     } 
    } 


    public PyConsoleControl() 
    { 
     InitializeComponent(); 
     if (!DesignMode) 
     { 
     thread = new Thread(pythonmain); 
     thread.IsBackground = true; 
     thread.Start(); 
     } 
    } 

    private void textBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Enter) 
     { 
      lock (qstring) 
      { 
       qstring.Enqueue(textBox1.Text); 
      } 
      textBox1.Clear(); 
     } 
    } 
} 

怎么可以看到我创建这是开始一个Python壳一个新的线程,但没有返回Python的输出。我该如何解决它?

+0

你有没有考虑过使用[IronPython](http://ironpython.codeplex.com/)? – danodonovan 2013-03-01 12:50:58

回答

0

绝对看看IronPython,它几乎肯定会做你想做的。

例如

using System; 
using IronPython.Hosting; 
using Microsoft.Scripting.Hosting; 
// we get access to Action and Func on .Net 2.0 
using Microsoft.Scripting.Utils; 

namespace TestCallIronPython 
{ 
    class Program 
    { 
     public static void Main(string[] args) 
     { 
      Console.WriteLine("Hello World!"); 
      ScriptEngine pyEngine = Python.CreateEngine(); 
      ScriptScope pyScope = pyEngine.CreateScope(); 
      pyScope.SetVariable("test", "test me"); 

      string code = @" 
      print 'test = ' + test 
      class MyClass: 
      def __init__(self): 
       pass 

      def somemethod(self): 
       print 'in some method' 

      def isodd(self, n): 
       return 1 == n&nbsp;% 2 
      "; 
      ScriptSource source = pyEngine.CreateScriptSourceFromString(code); 
      CompiledCode compiled = source.Compile(); 
      compiled.Execute(pyScope); 

      // Get the Python Class 
      object MyClass = pyEngine.Operations.Invoke(pyScope.GetVariable("MyClass")); 
      // Invoke a method of the class 
      pyEngine.Operations.InvokeMember(MyClass, "somemethod", new object[0]); 

      // create a callable function to 'somemethod' 
      Action SomeMethod2 = pyEngine.Operations.GetMember&lt;Action&gt;(MyClass, "somemethod"); 
      SomeMethod2(); 

      // create a callable function to 'isodd' 
      Func&lt;int, bool&gt; IsOdd = pyEngine.Operations.GetMember&lt;Func&lt;int, bool&gt;&gt;(MyClass, "isodd"); 
      Console.WriteLine(IsOdd(1).ToString()); 
      Console.WriteLine(IsOdd(2).ToString()); 

      Console.Write("Press any key to continue . . . "); 
      Console.ReadKey(true); 
     } 
    } 
} 

直接从this示例两者。

0

要小心,你应该确定这个过程实际上是开始的,为此目的你应该检查方法开始的结果。如果进程开始,它返回true,否则返回false。