Я только начал изучать разработку Raspberry Pi с помощью python и имел простую схему светодиодной схемы RGB на моем макете. Затем я подключил это к Pubnub для управления им из небольшого веб-интерфейса, который я построил, который просто отправляет имя метода и значения RGB над Pubnub, где скрипт python подписывается на конкретный канал.Не удается завершить работу скрипта python
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
, но это похоже, не вызывает исключение блока
Как я могу получить это, чтобы иметь возможность завершить и очистить контакты GPIO?
UPDATE
После рефакторинга использовать 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
еще не закрывает программу и не запускает код очистки
ли вы попробовать C TRL-D? –
нет, но он появляется 'ctrl + d' просто закрывает оболочку, когда я запускаю скрипт снова, он предупреждает о том, что контакты уже используются, поэтому мне действительно нужно сделать эту очистку – Jordan