我有一个运行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
答案 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)
您可以尝试的东西,虽然它不应该是您一直停止脚本的方式,但是使用
查找服务器的进程IDps aux | grep <name of what you executed to start the server>
然后kill -15 <pid>
。