【问题标题】:Embedding IronPython in a WinForms app and interrupting execution在 WinForms 应用程序中嵌入 IronPython 并中断执行
【发布时间】:2011-02-24 18:02:10
【问题描述】:
背景
我的问题
- 用户需要中断代码的执行
- 换句话说,他们需要能够在从 cmdline 运行 Python 或 IronPython 时按 CTRL-C 来停止执行
- 我想在 winform 中添加一个按钮,按下该按钮会停止执行,但我不确定如何执行此操作。
我的问题
- 我怎样才能使按下“停止”按钮实际上会停止使用输入的 IronPython 代码的执行?
注意事项
- 注意:我不希望简单地丢弃该“会话” - 我仍然希望用户能够与会话交互并访问在它停止之前可用的任何结果。
- 我假设我需要在单独的线程中执行此操作,任何正确执行此操作的指导或示例代码将不胜感激。
【问题讨论】:
标签:
ironpython
python-embedding
【解决方案1】:
这基本上是对 IronPython 控制台如何处理 Ctrl-C 的改编。如果要查看源,在BasicConsole 和CommandLine.Run。
首先,在一个单独的线程上启动 IronPython 引擎(正如您所假设的那样)。当你去运行用户的代码时,将它包装在一个try ... catch(ThreadAbortException) 块中:
var engine = Python.CreateEngine();
bool aborted = false;
try {
engine.Execute(/* whatever */);
} catch(ThreadAbortException tae) {
if(tae.ExceptionState is Microsoft.Scripting.KeyboardInterruptException) {
Thread.ResetAbort();
aborted = true;
} else { throw; }
}
if(aborted) {
// this is application-specific
}
现在,您需要保留对 IronPython 线程的引用。在表单上创建一个按钮处理程序,然后调用Thread.Abort()。
public void StopButton_OnClick(object sender, EventArgs e) {
pythonThread.Abort(new Microsoft.Scripting.KeyboardInterruptException(""));
}
KeyboardInterruptException 参数允许 Python 线程捕获 ThreadAbortException 并将其作为 KeyboardInterrupt 处理。