2015-12-24 2 views
1

Я новичок в Python. У меня есть код обратного вызова с резьбой, отлично работающий на моем raspi.Python: обратный вызов с резьбой не работает с режимом демона?

import RPi.GPIO as GPIO 
GPIO.setmode(GPIO.BCM) 
import time 
from daemon import runner 

GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # float switch goes down (closed to open) => low water level 
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # float switch goes up (opened to close) => high water level 

def callback_lowlevel(channel): 
    if GPIO.input(channel): 
     print "Low water level in the sump detected" 
    else: 
     print "Water level in the sump returned to normal" 

def callback_highlevel(channel): 
    if GPIO.input(channel): 
     print "High water level in the sump detected" 
    else: 
     print "Water level in the sump returned to normal" 

GPIO.add_event_detect(23, GPIO.BOTH, callback=callback_lowlevel, bouncetime=1000) 
GPIO.add_event_detect(24, GPIO.BOTH, callback=callback_highlevel, bouncetime=1000) 

Если я начну бесконечный цикл, как это:

try: 
    print "Waiting for events" 
    while True: 
     time.sleep(1) 

except KeyboardInterrupt: 
    GPIO.cleanup()  # clean up GPIO on CTRL+C exit 
GPIO.cleanup()   # clean up GPIO on normal exit 

Он работает.

Но если я «демонизирую» его с помощью библиотеки демонов, мои потоковые обратные вызовы больше не работают.

class App():       # Daemon content, not doing much, sleeping mostly, to lower CPU footprint 
    def __init__(self): 
     self.stdin_path = '/dev/null' 
     self.stdout_path = '/dev/stdout' 
     self.stderr_path = '/dev/stdout' 
     self.pidfile_path = '/var/run/aquamonitor.pid' 
     self.pidfile_timeout = 5 
    def run(self): 
     Logger("Starting monitoring") 
     while True: 
      time.sleep(1)       # Sleep most of time to be not too CPU intensive 
app = App()           # Init the App 
daemon_runner = runner.DaemonRunner(app)   # Run as a daemon 
daemon_runner.do_action()       # Just do it 

Что я делаю неправильно? Является ли тот факт, что это демон, меняет способ, которым я должен писать свои обратные вызовы с резьбой?

+0

Пробовал ли вы другие способы демонстрации процесса? ... как, например, 'os.fork' –

+0

Это через этот' self.pidfile_path = '/ var/run/aquamonitor.pid'' вы демонизируете свой процесс? –

+0

привет, извините за поздний ответ. Нет, я попробовал только демона lib. Сам демон дразнил daemon_runner. – kameo

ответ

1

У меня была такая же проблема, и я подумал, что регистрирую обратный вызов в неверную нить. Короче говоря, убедитесь, что GPIO.add_event_detect вызывается из метода запуска вашего класса App непосредственно перед циклом.