信号处理程序退出,但程序继续运行?

2024-09-25 00:32:26 发布

您现在位置:Python中文网/ 问答频道 /正文

显然,当我的信号处理器退出时,我的程序继续运行。即使在“logdone,close now”之后也会引发异常,这一点很明显。 有人能解释一下为什么会这样吗?注:功能已简化

^Clog   Ctrl-C
backup  State: not_span 328, pos 22, all_cycles 19
backup  backup complete, you may force exit now
log     Done, close now
Traceback (most recent call last):
  File "singleEdger.py", line 219, in <module>
    mySingleEdger.outputAllCycles()
  File "singleEdger.py", line 141, in outputAllCycles
    r = self.returnCycle( self.dfs_tree, self.not_span[self.pos])
  File "singleEdger.py", line 72, in returnCycle
    udfs = nx.Graph(dfs)                    # The trick is to make it undirected
  File "/var/lib/python-support/python2.6/networkx/graph.py", line 86, in __init__
    convert.from_whatever(data,create_using=self)
  File "/var/lib/python-support/python2.6/networkx/convert.py", line 76, in from_whatever
    "Input is not a correct NetworkX graph."
networkx.exception.NetworkXError: Input is not a correct NetworkX graph.

这些都是可供参考的功能

^{pr2}$

Tags: inpyself功能networkxcloseisline
3条回答

{else>在处理过程中应该避免长时间的处理,这样就可以避免在处理过程中调用较长的信号。原因是(在Python中)信号处理程序仍将被注册,任何相同类型的后续信号都将中断信号处理程序本身,导致它再次执行。这可能不是你想要的。在

或者您可以忽略处理程序中的信号,例如

import signal
def sigHandler(sig, frame):
    oldHandler = signal.signal(sig, signal.SIG_IGN)
    backup()    # lengthy processing here...
    signal.signal(sig, oldHandler)

但请注意,这只会忽略同一个信号-它仍然有可能被其他信号中断。您的backup()是否可重入?在

This discussion on reentrancy是相关的,尽管它是wrt C和Python有点不同,例如,不能阻塞信号(除非使用ctypes)。在

如果在按下^C时在正在进行的代码周围有一个try/except块,它将不起作用,因为exit()实际上引发了一个异常。见http://bugs.python.org/issue8021

即使try块不在您自己的代码中,而是在您所调用的库代码中,也是如此。我在编写的robot循环中使用urllib2.urlopen时注意到了这一点;urllib2的do\u open()例程在尝试连接到URL的代码周围使用try/except。在

我不认为你的代码还在运行。尽管异常输出在代码中的位置不同,但它不能保证在您的最终打印消息之前出现。异常输出将发送到STDERR,但是print语句将发送到STDOUT;在本例中,这两个语句恰好都在写入同一个终端设备。这两者是独立的缓冲区,所以输出的顺序不是强制性的;也就是说,你不能从输出的相对位置推断任何东西。在

如果将print语句放入单元测试中,您可以在单元测试框架中看到相同的现象。在

相关问题 更多 >