如何使用键盘中断完全停止脚本

时间:2014-03-16 02:50:48

标签: python raspberry-pi cherrypy gpio

我有一个运行cherrypy服务器的python脚本。当我按下CTRL + C时,它会停止服务器,但不会停止脚本中的功能。该功能将继续打印传感器值,无论按CTRL + C多少次,我都无法停止。如何确保CTRL + C可以停止所有(服务器和功能)?

以下是我的完整脚本:http://pastebin.com/yKLt3mJN

这是我试图阻止的功能:

@cherrypy.expose
def sensor(self):

    import RPi.GPIO as GPIO, time, os

    DEBUG = 1
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(11, GPIO.OUT)

    def RCtime (RCpin):
        reading = 0
        GPIO.setup(RCpin, GPIO.OUT)
        GPIO.output(RCpin, GPIO.LOW)
        time.sleep(1)

        GPIO.setup(RCpin, GPIO.IN)
        # This takes about 1 millisecond per loop cycle
        while (GPIO.input(RCpin) == GPIO.LOW):
            reading += 1
        return reading

    while True:
        sensorvalue= RCtime(12)

        if sensorvalue > 1000:
            print "switch on light"
            GPIO.output(11, True) #switch on
            lightstate ="On"
            time.sleep(1)
        else:
            print "switch off light"
            GPIO.output(11, False) #switch off
            lightstate ="Off"
            time.sleep(1)

        print sensorvalue # Read RC timing using BCM pin #18, physical pin 12

    return lightstate

如果我单独运行该功能,我可以阻止它。

^CTraceback (most recent call last):
  File "RCtime.py", line 25, in <module>
    print RCtime(18) # Read RC timing using pin #18
  File "RCtime.py", line 16, in RCtime
    time.sleep(0.1)
  KeyboardInterrupt

2 个答案:

答案 0 :(得分:3)

您需要在Python中捕获Ctrl + C,以便您可以正确终止程序并使用exit(0)或exit(1)安全退出。

请注意:

exit(0)表示没有任何错误/问题的干净退出

退出(1)表示存在一些问题/错误/问题,这就是程序退出的原因。

e.g

#!/usr/bin/env python

import signal
import sys

def signal_handler(signal, frame):
    exit(0)

signal.signal(signal.SIGINT, signal_handler)
# sleep until a signal is received
signal.pause()

答案 1 :(得分:0)

您可以尝试的东西,虽然它不应该是您一直停止脚本的方式,但是使用

查找服务器的进程ID
ps aux | grep <name of what you executed to start the server>

然后kill -15 <pid>