终止IronPython脚本

时间:2014-03-26 10:05:58

标签: python ironpython

这可能不是特定的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文章(herehere)表示sys.exit()应该做到这一点,所以我错过了什么?

1 个答案:

答案 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()