Python导入_数组使使用ctrl-c杀死嵌入式Python变得不可能

Python导入_数组使使用ctrl-c杀死嵌入式Python变得不可能,python,c++,numpy,boost-python,Python,C++,Numpy,Boost Python,我正在尝试在嵌入式Python中使用Numpy。我将Python 3.4和boost::Python与boost 1.57一起使用。为了防止Python设置一个信号处理程序来阻止我用Ctrl+C终止程序,我使用Py_InitializeEx(0) 现在的问题是,当我调用import_array()来设置Numpy时,这似乎添加了信号处理程序,我无法再使用Ctrl+C终止程序 以下是示例程序: #include <boost/python.hpp> #define NPY_NO_DE

我正在尝试在嵌入式Python中使用Numpy。我将Python 3.4和boost::Python与boost 1.57一起使用。为了防止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();
  }
}
#包括
#定义NPY\u否\u已弃用\u API NPY\u 1\u 7\u API\u版本
#定义PY\u数组\u唯一\u符号damaris\u数组\u API
#包括
使用名称空间boost::python;
静态void*init_numpy(){
导入数组();
返回NULL;
}
int main(int argc,字符**argv){
试一试{
Py_初始值(0);
对象主模块((
句柄(借来的(PyImport_AddModule(“uuu main_uuu“)”));
object main_namespace=main_module.attr(“uu dict_uu”);
init_numpy();
句柄被忽略((PyRun\u字符串(“print(\'Hello,World\”))),
Py_文件输入,
main_namespace.ptr(),
main_namespace.ptr());
而(1){
睡眠(1);
}
}捕获(已设置错误){
PyErr_Print();
}
}
当注释main中的“init_numpy”行时,我可以使用Ctrl+C终止程序。
如何使Python在仍然使用Numpy的情况下不捕获信号?

经过一些研究后回答我自己的问题,我不知道这是否是最干净的方法,但这种方法有效:

而不仅仅是

import_array();
使用


这基本上存储了调用import\u array之前的信号处理程序,然后我们做了一个import\u array,它会干扰信号处理程序,所以我们会在使用PyOS\u setsig之后立即恢复存储的信号处理程序。

您使用的是Windows和预构建的Numpy安装吗?英特尔Fortran编译器在中添加信号处理程序时出现问题。看不,我在Debian上用的是gcc。我完全误解了这个问题。
PyOS_sighandler_t sighandler = PyOS_getsig(SIGINT);
import_array();
PyOS_setsig(SIGINT,sighandler);