Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python键盘中断双击_Python - Fatal编程技术网

python键盘中断双击

python键盘中断双击,python,Python,我在Python 2.7下的程序(在linux上)具有以下功能: signal.signal(signal.SIGINT,self.stop) # CTRL-C stop (-INT TERM) signal.signal(signal.SIGUSR1,self.pause) # pause signal.signal(signal.SIGUSR2,self.resume) # resume signal.signal(signal.SIGTERM,self.stop) # stop

我在Python 2.7下的程序(在linux上)具有以下功能:

signal.signal(signal.SIGINT,self.stop)    # CTRL-C stop (-INT TERM)
signal.signal(signal.SIGUSR1,self.pause)  # pause
signal.signal(signal.SIGUSR2,self.resume) # resume
signal.signal(signal.SIGTERM,self.stop)   # stop
使用kill-pid,所有这些都可以正常工作。但是,如果在执行过程中按CTRL-C,则会调用停止函数两次

我甚至尝试捕捉键盘中断异常,但它从未被调用

如果我的stop函数调用了两次,就会引发一个异常,我现在已经注释掉了,但我更希望在没有解决方法的情况下运行这个函数

有什么想法吗

INT和TERM的信号处理程序

def stop(self,signum=None,stack=None):
    if self._state == WASP_RUNNING or self._state == WASP_PAUSED:
        logging.info("**** Stopping Wasp ****")
        self._halt.set()
    else:
        raise WaspRuntimeException, "Wasp state %d not valid for stop" % self._state
调用WaspRuntimeException时,会调用上面的两次。我还添加了打印声明以确认这一点

整个节目很长。下面是启动函数,希望它是重要的部分。init仅将所有内部变量设置为无。函数_create(),读取配置文件,创建事件_halt,在监视模式下创建虚拟无线nic,创建一个子进程(目前)扫描仪,扫描仪每隔100ms左右设置无线nic通道。函数_destroy()销毁虚拟nic,向扫描仪发送毒药丸,并等待其加入

def start(self):
    signal.signal(signal.SIGINT,self.stop)    # CTRL-C stop
    signal.signal(signal.SIGUSR1,self.pause)  # pause
    signal.signal(signal.SIGUSR2,self.resume) # resume
    signal.signal(signal.SIGTERM,self.stop)   # stop

    logging.info("**** Starting Wasp ****")
    self._create()
    self._state = WASP_RUNNING
    while not self._halt.is_set():
        if self._state == WASP_RUNNING:
            if self._err.has_key('scanner'):
                logging.error("Scanner failed. (%s) %s",self._err['scanner'][0],\
                                                        self._err['scanner'][1])
                self._state = WASP_INVALID
                self._halt.set()
                continue
        time.sleep(1)
    self._destroy()
该程序称为:

if __name__ == 'wasp':
    w = None
    try:
        logging.info("Wasp %s",__version__)
        w = Wasp()
        w.start()
    except WaspConfException, e: # w failed to start, no need to stop
        logging.error("Configuration Error: %s",e)
    except WaspParamException, e:
        logging.error("Parameter Error: %s",e)
        if w and (w.state() == WASP_RUNNING or w.state() == WASP_PAUSED): w.stop()
    except WaspRuntimeException, e:
        logging.error("Runtime Error: %s",e)
        if w and (w.state() == WASP_RUNNING or w.state() == WASP_PAUSED): w.stop()
    except WaspException, e:
        logging.error("General Error: %s",e)
        if w and (w.state() == WASP_RUNNING or w.state() == WASP_PAUSED): w.stop()
    except Exception, e:
        logging.exception("Unknown Error: %s",e)
        if w and (w.state() == WASP_RUNNING or w.state() == WASP_PAUSED): w.stop()
state函数只返回一个内部变量
我最初认为可能是调用了异常,从而导致再次调用stop。但是,没有记录任何内容。我添加了如上所示的状态检查,只是为了确保。

你能给我们看看你的信号处理函数吗?@TheSoundDefense我在我的问题中添加了停止函数。嗯,我尝试在没有对象引用的情况下实现它,但无法重新创建问题。您能给我们看一下对象吗,或者您正在使用的
set()
函数吗?添加-整个代码需要添加很多。我的最佳猜测是您在
\u create
中创建的子进程与此问题有关。在这个过程中会发生什么?如果您在更改信号处理程序之前创建了子进程,问题会得到解决吗?