2016-12-30 3 views
0

Я только начал изучать разработку 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 еще не закрывает программу и не запускает код очистки

+0

ли вы попробовать C TRL-D? –

+0

нет, но он появляется 'ctrl + d' просто закрывает оболочку, когда я запускаю скрипт снова, он предупреждает о том, что контакты уже используются, поэтому мне действительно нужно сделать эту очистку – Jordan

ответ

1

Используя модуль signal, вы можете создать глобальный обработчик прерываний:

import signal 
import sys 

def sig_handler(signal, frame): 
    print('Cleaning Up') 
    G.cleanup() 
    pubnub.unsubscribe(channel='rasprgb') 
    sys.exit(0) 

signal.signal(signal.SIGINT, sig_handler) 

Теперь, когда вы CTRL-C, ваш код очистки будет работать, и программа завершится. Я использую Perl в основном на моем Pis, но я делаю то же самое, чтобы все булавки были сброшены до повторного запуска одного и того же приложения или запуска другого приложения.

+0

, это все еще не работает – Jordan

+0

Вы не помещаете это в блок за исключением, не так ли? – stevieb

+0

Нет, идет ли сигнал signal.signal в блоке исключений? – Jordan

0

Вы можете выйти из сценария, используя любую клавишу с этой функцией. Я также не вижу проблемы с петлей в то время, но если я действительно нужен альтернативный метод, я хотел бы использовать это:

import sys, os 

def wait_key(): 
    ''' Wait for a key press on the console and return it. ''' 
    result = None 

    import termios 
    fd = sys.stdin.fileno() 

    oldterm = termios.tcgetattr(fd) 
    newattr = termios.tcgetattr(fd) 
    newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO 
    termios.tcsetattr(fd, termios.TCSANOW, newattr) 

    try: 
     result = sys.stdin.read(1) 
    except IOError: 
     pass 
    finally: 
     termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm) 

    return result 

print('Press any key to quit: ') 
wait_key() 

Другой подобный метод может быть использован при использовании проклятья модуля как так:

import curses 
stdscr = curses.initscr() 
c = stdscr.getch() 
print 'you entered', chr(c) 
curses.endwin() 

Кроме того, если вы используете Windows, вы можете использовать MSVCRT модуль:

import msvcrt 
c = msvcrt.getch() 
print 'you entered', c 

 Смежные вопросы

  • Нет связанных вопросов^_^