Python import_array 使得无法使用 ctrl-c 杀死嵌入式 python
Python import_array makes it impossible to kill embedded python with ctrl-c
我正在尝试在嵌入式 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杀死程序。
如何在仍然使用 Numpy 的同时使信号不被 Python 捕获?
经过一些研究回答我自己的问题,我不知道这是否是最干净的方法,但这个方法有效:
而不只是
import_array();
使用
PyOS_sighandler_t sighandler = PyOS_getsig(SIGINT);
import_array();
PyOS_setsig(SIGINT,sighandler);
这基本上存储了调用 import_array 之前的信号处理程序,然后我们执行了一个 import_array 来扰乱信号处理程序,因此我们在 [=22] 之后立即恢复存储的信号处理程序=].
我正在尝试在嵌入式 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杀死程序。 如何在仍然使用 Numpy 的同时使信号不被 Python 捕获?
经过一些研究回答我自己的问题,我不知道这是否是最干净的方法,但这个方法有效:
而不只是
import_array();
使用
PyOS_sighandler_t sighandler = PyOS_getsig(SIGINT);
import_array();
PyOS_setsig(SIGINT,sighandler);
这基本上存储了调用 import_array 之前的信号处理程序,然后我们执行了一个 import_array 来扰乱信号处理程序,因此我们在 [=22] 之后立即恢复存储的信号处理程序=].