Я новичок в 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
Что я делаю неправильно? Является ли тот факт, что это демон, меняет способ, которым я должен писать свои обратные вызовы с резьбой?
Пробовал ли вы другие способы демонстрации процесса? ... как, например, 'os.fork' –
Это через этот' self.pidfile_path = '/ var/run/aquamonitor.pid'' вы демонизируете свой процесс? –
привет, извините за поздний ответ. Нет, я попробовал только демона lib. Сам демон дразнил daemon_runner. – kameo