[英]Python import_array makes it impossible to kill embedded python with ctrl-c
我正在嘗試在嵌入式Python中使用Numpy。 我使用Python 3.4和帶有Boost 1.57的boost :: python。 為了防止Python設置信號處理程序以防止我用Ctrl + C終止程序,我使用Py_InitializeEx(0)。
現在的問題是,當我調用import_array()設置Numpy時,這似乎添加了信號處理程序,並且我再也無法使用Ctrl + C終止程序了。
這是示例程序:
#include <boost/python.hpp>
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#define PY_ARRAY_UNIQUE_SYMBOL damaris_ARRAY_API
#include <numpy/arrayobject.h>
using namespace boost::python;
static void* init_numpy() {
import_array();
return NULL;
}
int main( int argc, char ** argv ) {
try {
Py_InitializeEx(0);
object main_module((
handle<>(borrowed(PyImport_AddModule("__main__")))));
object main_namespace = main_module.attr("__dict__");
init_numpy();
handle<> ignored(( PyRun_String( "print(\"Hello, World\")",
Py_file_input,
main_namespace.ptr(),
main_namespace.ptr() ) ));
while(1) {
sleep(1);
}
} catch( error_already_set ) {
PyErr_Print();
}
}
在main中注釋“ init_numpy”行時,可以使用Ctrl + C終止該程序。 如何在仍然使用Numpy的情況下使信號不會被Python捕獲?
經過研究后回答了我自己的問題,我不知道這是否是最干凈的方法,但是這種方法有效:
不只是
import_array();
采用
PyOS_sighandler_t sighandler = PyOS_getsig(SIGINT);
import_array();
PyOS_setsig(SIGINT,sighandler);
這基本上存儲了在調用import_array之前在這里的信號處理程序,然后我們做了一個import_array,它與信號處理程序混為一談,因此我們使用PyOS_setsig恢復了存儲的信號處理程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.