Python import_array使用ctrl-c无法杀死嵌入式python

时间:2015-02-26 19:09:34

标签: 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_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终止程序。 我怎样才能使Python在没有使用Numpy的情况下捕获信号?

1 个答案:

答案 0 :(得分:6)

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

而不仅仅是

import_array();

使用

PyOS_sighandler_t sighandler = PyOS_getsig(SIGINT);
import_array();
PyOS_setsig(SIGINT,sighandler);

这基本上存储了调用import_array之前的信号处理程序,然后我们做了一个与信号处理程序混淆的import_array,所以我们在PyOS_setsig之后立即恢复存储的那个。