From 6123a68195a116efb402167d47672a1586b7441e Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Mon, 28 Oct 2019 13:12:18 +0100 Subject: [PATCH] Cmds.py: Run all commands in asyncio event loop This commit makee Cmds run all sub-commands in an asyncio event loop. The event loop is currently passed to the commands, which seems unnecessary and looks like it's using a feature which is bound to be deprecated in the future. Signed-off-by: Jan Lindemann --- tools/python/jwutils/Cmds.py | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/tools/python/jwutils/Cmds.py b/tools/python/jwutils/Cmds.py index eb54a71..56ef93b 100644 --- a/tools/python/jwutils/Cmds.py +++ b/tools/python/jwutils/Cmds.py @@ -1,15 +1,16 @@ import os import sys import argparse -import jwutils import importlib import inspect import re import pickle +import asyncio +import jwutils class Cmds: # export - def __init__(self, description = '', filter = '^Cmd.*', modules=None): + def __init__(self, description = '', filter = '^Cmd.*', modules=None, eloop=None): self.__description = description self.__filter = filter self.__modules = modules @@ -17,6 +18,11 @@ class Cmds: # export formatter_class=argparse.ArgumentDefaultsHelpFormatter, description=self.__description) self.__parser.add_argument('--log-flags', help='Log flags', default='stderr,position,prio,color') self.__parser.add_argument('--log-level', help='Log level', default=jwutils.log.NOTICE) + self.eloop = eloop + self.__own_eloop = False + if eloop is None: + self.eloop = asyncio.get_event_loop() + self.__own_eloop = True subparsers = self.__parser.add_subparsers(title='Available commands', metavar='') if self.__modules == None: self.__modules = [ '__main__' ] @@ -28,17 +34,31 @@ class Cmds: # export continue if inspect.isabstract(c): continue - c().add_parser(subparsers) + cmd = c() + cmd.cmds = self + cmd.add_parser(subparsers) + + async def __run(self): + #def __run(self): + args = self.__parser.parse_args() + jwutils.log.set_level(args.log_level) + jwutils.log.set_flags(args.log_flags) + return await args.func(args) + + def __del__(self): + if self.__own_eloop: + if self.eloop is not None: + self.eloop.close() + self.eloop = None + self.__own_eloop = False def parser(): return self.__parser def run(self): - args = self.__parser.parse_args() - jwutils.log.set_level(args.log_level) - jwutils.log.set_flags(args.log_flags) - args.func(args) + #return self.__run() + return self.eloop.run_until_complete(self.__run()) def run_sub_commands(description = '', filter = '^Cmd.*', modules=None): # export cmds = Cmds(description, filter, modules) - cmds.run() + return cmds.run()