【发布时间】:2013-03-01 10:34:32
【问题描述】:
我正在尝试创建一个实现 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 shell 的新线程,但没有返回 Python 输出。我该如何解决?
【问题讨论】:
-
你考虑过使用IronPython吗?
标签: c# python multithreading process