私はちょうどPythonでRaspberry Piの開発を学び始めました。ブレッドボードに簡単なRGB LED回路を設定しました。これをPubnubに接続して、 Pythonスクリプトが特定のチャンネルを購読しているPubnubにメソッド名とRGB値を送信します。実行中の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')
このすべては、私がwhile True:
ループを使ってきたし、それが働いている過去になど
、チャネルからの退会、プログラムを閉じて、GPIOピンをクリーンアップしようとしている以外の作品私はここでループで何かしたくないので、私は接続を開いて、ループを終了するまで開こうとします。ループは意味がありません。
Ctrl + C
はちょうどKeyboardInterrupt
を出力しますが、除外ブロックを呼び出すようではない
GPIOピンを終端してクリーンアップするにはどうしたらいいですか?
UPDATE
ここsignal
を使用するようにリファクタリングした後、私は今まだctrl + c
を押すと、しかし、(私は、ファイルの先頭にそれらをインポートしていると仮定)
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)
をtry...except
を交換したものですプログラムを終了せずにクリーンアップコードを実行しないでください
をあなたがCを試してみましたtrl-D? –
いいえ、 'ctrl + d'はシェルを閉じるだけですが、スクリプトを再実行すると、すでに使用中のピンについて警告されますので、実際にそのクリーンアップを行う必要があります。 – Jordan