def callback_wrapper(): # 必须要确定,这次调用就是这个timer引起的 if self.timer == timer: self.timer = None result = safe_call(callback) if repeat and not self.timer: # 之所以还要判断timer,是因为callback中可能设置了新的回调 self.set(interval, callback, repeat, True) return result
def main(): modules = [] log = get_logger("Main", [stdout]) msg = "Module '%s' %s() returned code: %s" try: # Load modules for filename in listdir(get_base_dir() + sep + MODULES): if "__" in filename: continue name = filename.split(".py")[0] try: # Import file in dir mod = importlib.import_module(MODULES + "." + name) class_name = default_class(name) cls = getattr(mod, class_name, None) if cls is None: log.error("Module '%s' doesn't have class: %s" % (filename, class_name)) module = cls(modules) # Store to loaded or unload it if module.enable: modules.append(module) log.info("Module '%s' loaded from %s" % (module.name, filename)) else: code = module.unload() log.info( "Module '%s' was loaded from %s but is disabled, returned code: %s" % (module.name, filename, code) ) except ImportError as ie: log.error("Module '%s' failed to import: %s" % (filename, ie)) raise ie # Check if any loaded total = len(modules) if total == 0: raise Exception("No module loaded!") log.info("Loaded %s modules" % total) # Run each module while True: for module in frozenset(modules): # Run if its time if module.is_interval(): code = module.run() if code < 0: raise Exception(msg % (module.name, "run", code)) log.debug(msg % (module.name, "run", code)) module.last_time = time() # Remove if no interval if module.interval == 0: code = safe_call(module.unload, log, None, None, False) log.debug(msg % (module.name, "unload", code)) sleep(0.5) finally: # Attempt to unload modules for module in frozenset(modules): code = safe_call(module.unload, log, None, None, False) log.info(msg % (module.name, "unload", code))
raise Exception(msg % (module.name, "run", code)) log.debug(msg % (module.name, "run", code)) module.last_time = time() # Remove if no interval if module.interval == 0: code = safe_call(module.unload, log, None, None, False) log.debug(msg % (module.name, "unload", code)) sleep(0.5) finally: # Attempt to unload modules for module in frozenset(modules): code = safe_call(module.unload, log, None, None, False) log.info(msg % (module.name, "unload", code)) if __name__ == "__main__": try: # open(get_base_dir() + sep + LOG_FILENAME, "w").close() # Clear log error_log = get_logger("Init", [stderr]) error_flag = Event() safe_call(main, error_log, error_flag, None, False) if error_flag.is_set() and not flag_verbose_mode(): show_message(error_log, logging.ERROR, "Error at main") except Exception as e: if not flag_verbose_mode(): show_message(None, logging.ERROR, "Error at main: %s" % e) raise e exit()