簡體   English   中英

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 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM