Python C/C++ APIでKeyboardInterruptで処理を停止できない
Python C/C++ APIで下記のようにforで0から引数としてとった整数までを表示させる物を書いているのですが、Ctrl-Cを押しても割り込んで処理を停止させることができません。
9999999まで表示した後でKeyboardInterruptが出てしまいます。
どうすればいいのでしょうか?
ちなみにコンパイルはpython3 setup.py build_ext -i
でやっています。
環境はOS X 10.10, Python3.4.3です
#include <iostream>
#include <Python.h>
static PyObject*
for_int(PyObject *self, PyObject *args)
{
int x;
if (!PyArg_ParseTuple(args, "i", &x))
return NULL;
for (int i=0; i<x; i++) {
std::cout << i << "\n";
}
Py_INCREF(Py_None);
return Py_None;
}
static PyMethodDef For_INT_Methods[] = {
{"for_int", for_int, METH_VARARGS,
"fast increment print"},
{NULL, NULL, 0 , NULL}
};
static struct PyModuleDef for_int_module = {
PyModuleDef_HEAD_INIT,
"for_int",
"spam_doc_string",
-1,
For_INT_Methods
};
PyMODINIT_FUNC
PyInit_for_int(void)
{
PyObject *m;
m = PyModule_Create(&for_int_module);
if (m == NULL)
return NULL;
Py_INCREF(PyExc_KeyboardInterrupt);
PyModule_AddObject(m, "InterruptError", PyExc_KeyboardInterrupt);
return m;
}
int
main(int argc, char *argv[])
{
PyImport_AppendInittab("for_int", PyInit_for_int);
Py_Initialize();
PyImport_ImportModule("for_int");
}
コンパイルするためのsetup.py
from distutils.core import setup, Extension
module = Extension('for_int', ['for.cpp'])
setup(name='for',
version='1.0',
ext_modules=[module],
)
追記
forの部分でPyErr_CheckSignals()を呼び出すようにしました(code2)
しかし、Ctrl-Cを押しても処理は止まりませんでした。
code2
for (int i=0; i<x; i++) {
PyErr_CheckSignals(); # 追加
std::cout << i << "\n";
}