C++ 用Cython中的键盘中断“while loop”
我希望能够使用cython中断一个长函数,使用通常的CTRL+C中断命令。 我的C++长函数在Cython代码中反复调用while循环,但是我希望在循环期间发送一个“中断”并阻止while循环。 中断还应等待longFunction()完成,以便没有数据丢失或保持未知状态 这是我的第一个实现,显然不起作用:C++ 用Cython中的键盘中断“while loop”,c++,python,interrupt,cython,keyboard-events,C++,Python,Interrupt,Cython,Keyboard Events,我希望能够使用cython中断一个长函数,使用通常的CTRL+C中断命令。 我的C++长函数在Cython代码中反复调用while循环,但是我希望在循环期间发送一个“中断”并阻止while循环。 中断还应等待longFunction()完成,以便没有数据丢失或保持未知状态 这是我的第一个实现,显然不起作用: computed=0; print "Computing long function..." while ( computed==0 ): try:
computed=0;
print "Computing long function..."
while ( computed==0 ):
try:
computed = self.thisptr.aLongFunction()
except (KeyboardInterrupt, SystemExit):
computed=1
print '\n! Received keyboard interrupt.\n'
break;
(p.s.
self.thisptr
是指向当前类的指针,该类实现了aLongFunction()
)您应该能够执行以下操作:
import signal
class Test():
def __init__(self):
self.loop_finished = False
signal.signal(signal.SIGINT, self.abort_loop)
def abort_loop(self, signal, frame):
self.loop_finished = True
def go(self):
while not self.loop_finished:
print "Calculating"
# Do your calculations
# Once calcations are done, set self.loop_finished to True
print "Calculating over"
Test().go()
您还可以使用其他变量来跟踪计算是否被手动中止。我不是Python C-Api foo大师,但是这是可行的,但可能不是最好的方法:
cdef extern from "Python.h":
int PyErr_CheckSignals()
def test_interrupt():
cdef int i = 0
while i < 9999999999 and not PyErr_CheckSignals():
# do fancy stuff.
i += 1
另请参见您要做的是捕获
SIGINT
。看,嗯,这个解决方案不适用于我的函数…循环没有停止我发布了一个答案,让我知道它是否有效。我在为我的类设置属性时遇到了问题,因为我的类是一个cdef类(我使用Cython),当我在cinit中设置类属性时,我发现属性是只读的。我在Cython中做得很少,我(可能是愚蠢的)假设它也会起同样的作用。希望其他人能帮助你。一种可能有效的方法是将loop\u finished
设置为[False]
,在abort\u loop
中使用self.loop\u finished[0]=True
并在中检查loop\u finished[0]的真值
。如果cython的int是可变的,您可以简单地将循环\u finished
增加1,而不是将其设置为True
。为什么要寻址self.loop\u finished[0]
?不是数组或list@linello,你真的看到了吗?我添加了Exception*的东西,我认为这会更好,但我没有尝试。我认为这样的方法也应该有效,但前提是它可能是Cython函数。
cdef function(...) except *:
pass