C#中的Python控制台
我正在尝试创建一个控件,用来实现一个Python控制台。不过,遗憾的是,它没有接收到任何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的输出。我该怎么解决这个问题呢?
2 个回答
0
要小心哦,你得确认这个进程确实已经启动。为此,你应该检查一下启动方法的结果。如果返回的是true,说明进程已经启动;如果是false,那就表示没有启动。
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 % 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<Action>(MyClass, "somemethod");
SomeMethod2();
// create a callable function to 'isodd'
Func<int, bool> IsOdd = pyEngine.Operations.GetMember<Func<int, bool>>(MyClass, "isodd");
Console.WriteLine(IsOdd(1).ToString());
Console.WriteLine(IsOdd(2).ToString());
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
这个例子直接来自于 这里。