Пример #1
0
def run_forever(args, config):
    # ensure requiresments, raise SystemExit if failed
    os.chdir(os.path.join(os.path.dirname(__file__), '../..'))
    ensure_dirs()

    # In an ideal world, users are capable to do anything in rcfile,
    # including monkeypatch, so we should load rcfile as early as possible
    fuoexec_load_rcfile(config)

    # Extract config items from args and setup config object,
    # since then, no more `args` object, only `config`.
    setup_config(args, config)

    setup_logger(config)

    # create app instance with config
    #
    # nothing should happen except all objects are created
    app = create_app(config)

    # do fuoexec initialization before app inits
    fuoexec_init(app)

    # initialize app with config
    #
    # all objects can do initialization here. some objects may emit signal,
    # some objects may connect with others signals.
    init_app(app)

    app.initialized.emit(app)

    run_app(app)
Пример #2
0
async def start_app(args, config, sentinal=None):
    """
    The param sentinal is currently only used for unittest.
    """
    Signal.setup_aio_support()

    app = create_app(args, config)

    # Do fuoexec initialization before app initialization.
    fuoexec_init(app)

    # Initialize app with config.
    #
    # all objects can do initialization here. some objects may emit signal,
    # some objects may connect with others signals.
    app.initialize()
    app.initialized.emit(app)

    # Load last state.
    app.load_state()

    def sighanlder(signum, _):
        logger.info('Signal %d is received', signum)
        app.exit()

    # Handle signals.
    signal.signal(signal.SIGTERM, sighanlder)
    signal.signal(signal.SIGINT, sighanlder)

    if sentinal is None:
        sentinal: asyncio.Future = asyncio.Future()

    def shutdown(_):
        # Since about_to_shutdown signal may emit multiple times
        # (QApplication.aboutToQuit emits multiple times),
        # we should check if it is already done firstly.
        if not sentinal.done():
            sentinal.set_result(0)

    app.about_to_shutdown.connect(shutdown, weak=False)

    # App can exit in several ways.
    #
    # GUI mode:
    # 1. QApplication.quit. QApplication.quit can be called under several circumstances
    #    1. User press CMD-Q on macOS.
    #    2. User clicks the tray icon exit button.
    # 2. SIGTERM is received.
    #
    # Daemon mode:
    # 1. Ctrl-C
    # 2. SIGTERM
    app.run()
    await sentinal

    Signal.teardown_aio_support()
Пример #3
0
def run_once(args, config):
    # ignore all warnings since it will pollute the output
    warnings.filterwarnings("ignore")

    fuoexec_load_rcfile(config)
    setup_config(args, config)
    app = create_app(config)
    fuoexec_init(app)
    init_app(app)
    app.initialized.emit(app)

    future = oncemain(app, args)
    if future is not None:
        run_app_once(app, future)