如何通过键盘中断完全停止脚本

2 投票
2 回答
7069 浏览
提问于 2025-04-17 22:30

我有一个用Python写的脚本,它在运行一个叫做cherrypy的服务器。当我按下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

你可以尝试一种方法,虽然这并不是你每次都应该用来停止脚本的方式。你可以先找到服务器的进程ID,使用

ps aux | grep <name of what you executed to start the server>

然后再用 kill -15 <pid> 来结束这个进程。

3

你需要在Python中捕捉到Ctrl+C这个操作,这样才能正确地结束程序,并安全地退出,使用exit(0)或exit(1)来实现。

需要注意的是:

exit(0)表示程序正常退出,没有任何错误或问题。

exit(1)表示程序遇到了一些问题或错误,所以才会退出。

例如:

#!/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()

撰写回答