2011-04-04 59 views
8

我在運行嵌入式python時遇到了麻煩。事實證明,我無法捕獲由sys.exit()引發的SystemExit異常;如何防止嵌入式python退出()我的過程

這是我到目前爲止有:

$ cat call.c 
#include <Python.h> 
int main(int argc, char *argv[]) 
{ 
    Py_InitializeEx(0); 
    PySys_SetArgv(argc-1, argv+1); 
    if (PyRun_AnyFileEx(fopen(argv[1], "r"), argv[1], 1) != 0) { 
     PyObject *exc = PyErr_Occurred(); 
     printf("terminated by %s\n", 
       PyErr_GivenExceptionMatches(exc, PyExc_SystemExit) ? 
       "exit()" : "exception"); 
    } 
    Py_Finalize(); 
    return 0; 
} 

而且,我的腳本是:

$ cat unittest-files/python-return-code.py 
from sys import exit 
exit(99) 

運行它:

$ ./call unittest-files/python-return-code.py 
$ echo $? 
99 

必須執行文件,不是一個命令。

回答

5

PyRun_SimpleFileExFlags函數(和使用它的所有函數,包括PyRun_AnyFileEx)通過退出SystemExit或打印回溯來處理異常本身。使用PyRun_File*函數族來處理周圍代碼中的異常。

+1

不錯的解決方案。現在使用PyRun_FileEx()並在PyErr_GivenExceptionMatches()之前檢查PyErr_Occurred()。謝謝。 – Caruccio 2011-04-04 17:47:29