2014-03-26 109 views
1

這可能並不是一個IronPython問題,所以Python開發者可能會提供幫助。終止一個IronPython腳本

我想在我的.net桌面應用程序中使用IronPython運行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()應該做的伎倆,所以我錯過了什麼?

回答

2

似乎無法終止正在運行的腳本 - 至少不是以「友好」的方式。我見過的一種方法是在另一個線程中運行IronPython引擎,如果需要停止腳本,則中止線程。

我並不熱衷於這種蠻力方法,因爲這樣做可能會使腳本(例如文件)所使用的資源處於打開狀態。

最後,我創建了一個C#輔助類是這樣的: -

public class HostFunctions 
{ 
    public bool AbortScript { get; set; } 

    // Other properties and functions that I want to expose to the script... 
} 

當宿主應用程序要終止它設置AbortScript到真正的腳本。這個對象是通過範圍傳遞給正在運行的腳本: -

_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()