这可能不是特定的IronPython问题,所以Python开发者可能会提供帮助。
我想使用IronPython在我的.Net桌面应用程序中运行python脚本,并希望用户能够强制终止脚本。这是我的测试脚本(我是Python的新手,所以它可能不完全正确): -
import atexit
import time
import sys
@atexit.register
def cleanup():
print 'doing cleanup/termination code'
sys.exit()
for i in range(100):
print 'doing something'
time.sleep(1)
(请注意,我可能希望在某些脚本中指定" atexit"函数,允许它们在正常或强制终止期间执行任何清理。)
在我的.Net代码中,我使用以下代码终止脚本:
_engine.Runtime.Shutdown();
这会导致调用脚本的atexit
函数,但脚本实际上并未终止 - for
循环继续运行。其他几篇SO文章(here和here)表示sys.exit()
应该做到这一点,所以我错过了什么?
答案 0 :(得分:2)
似乎无法终止正在运行的脚本 - 至少在"友好"办法。我见过的一种方法是在另一个线程中运行IronPython引擎,如果需要停止脚本,则中止该线程。
我并不热衷于这种蛮力方法,这可能会使脚本使用的资源(例如文件)保持打开状态。
最后,我创建了一个C#helper类,如下所示: -
public class HostFunctions
{
public bool AbortScript { get; set; }
// Other properties and functions that I want to expose to the script...
}
当托管应用程序想要终止脚本时,它会将AbortScript
设置为true。该对象通过范围传递给正在运行的脚本: -
_hostFunctions = new HostFunctions();
_scriptScope = _engine.CreateScope();
_scriptScope.SetVariable("HostFunctions", _hostFunctions);
在我的脚本中,我只需要策略性地放置检查以查看是否已请求中止,并适当地处理它,例如: -
for i in range(100):
print 'doing something'
time.sleep(1)
if HostFunctions.AbortScript:
cleanup()