【发布时间】:2016-12-30 15:05:08
【问题描述】:
我刚开始学习使用 python 进行 Raspberry Pi 开发,并在我的面包板上设置了一个简单的 RGB LED 电路,然后我将它连接到 Pubnub 以通过我构建的一个小 Web 界面控制它,该界面只发送一个方法名称和 RGB 值python脚本订阅特定频道的Pubnub。
from pubnub import Pubnub
import RPi.GPIO as G
import time
pubnub = Pubnub(publish_key="****", subscribe_key="****")
def callback(message, channel):
globals()[message['method']](message['data'])
def error(message):
print("ERROR: " + str(message))
def connect(message):
print("CONNECTED")
def reconnect(message):
print("RECONNECTED")
def disconnect(message):
print("DISCONNECTED")
G.setmode(G.BCM)
red_channel_pin = 18
green_channel_pin = 23
blue_channel_pin = 24
G.setup(red_channel_pin, G.OUT)
G.setup(green_channel_pin, G.OUT)
G.setup(blue_channel_pin, G.OUT)
pwm_red = G.PWM(red_channel_pin,500)
pwm_red.start(100)
pwm_green = G.PWM(green_channel_pin,500)
pwm_green.start(100)
pwm_blue = G.PWM(blue_channel_pin,500)
pwm_blue.start(100)
def set_rgb_values(data):
pwm_red.ChangeDutyCycle(float(data['red']))
pwm_green.ChangeDutyCycle(float(data['green']))
pwm_blue.ChangeDutyCycle(float(data['blue']))
try:
pubnub.subscribe(channels="rasprgb",callback=callback, error=error, connect=connect, reconnect=reconnect, disconnect=disconnect)
except KeyboardInterrupt:
print('Cleaning Up')
G.cleanup()
pubnub.unsubscribe(channel='rasprgb')
除了尝试关闭程序并清理 GPIO 引脚、取消订阅频道等之外,所有这些都有效。
过去我使用过while True: 循环并且它有效,但是由于我不想在这里循环执行某些操作,我只想打开一个连接并保持打开状态直到我终止它循环在这里没有意义
点击Ctrl + C 只会输出KeyboardInterrupt,但它似乎没有调用 except 块
我怎样才能让它能够终止和清理 GPIO 引脚?
更新
重构为使用signal 后,我现在替换了try...except(假设我已在文件顶部导入它们)
def sig_handler(signal,frame):
print('Cleaning Up')
G.cleanup()
pubnub.unsubscribe(channel='rasprgb')
sys.exit(0)
pubnub.subscribe(channels="rasprgb",callback=callback, error=error, connect=connect, reconnect=reconnect, disconnect=disconnect)
signal.signal(signal.SIGINT, sig_handler)
但是,按下ctrl + c 仍然不会关闭程序并运行清理代码
【问题讨论】:
-
你试过 Ctrl-D 吗?
-
没有,但它似乎
ctrl + d只是关闭了外壳,当我再次运行脚本时,它会警告引脚已经在使用中,所以我真的需要进行清理
标签: python raspberry-pi pubnub keyboardinterrupt