__init__.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import os
  2. import logging
  3. from multiprocessing import Queue
  4. import time
  5. import threading
  6. from sys import exit
  7. PATH = os.getcwd()
  8. LOG_DIR = rf'{PATH}{os.sep}Log{os.sep}log_system.log'
  9. LOG_FORMAT = '%(asctime)s - %(pathname)s - %(levelname)s [%(lineno)d]%(funcName)s %(message)s'
  10. basicConfig = dict(filename=LOG_DIR, level=logging.DEBUG, format=LOG_FORMAT)
  11. logging.basicConfig(**basicConfig)
  12. class NoPluginError(Exception):
  13. pass
  14. def get_path(name):
  15. return f'{PATH}{os.sep}{name}'
  16. def plugin_class_loading(template_path):
  17. # 装饰器,装饰类的,允许使用自定义插件
  18. def plugin_read(base):
  19. name = base.__name__
  20. template = f'{template_path}/template_{name}.py'.replace('/', os.sep)
  21. try:
  22. if os.path.exists(template):
  23. with open(template, 'r') as f:
  24. namespace = {'base': base}
  25. exec(f.read().replace('base = None', ''), namespace)
  26. logging.info(f'{base.__name__} use plugin success')
  27. return namespace[name]
  28. else:
  29. raise NoPluginError
  30. except NoPluginError as e:
  31. # logging.info(str(e) + 'no plugin')
  32. return base
  33. except BaseException as e:
  34. logging.info(f'{base.__name__} plugin wrong {e}')
  35. return base
  36. return plugin_read
  37. plugin_func_loading = plugin_class_loading
  38. def exception_catch(*args_catch, **kwargs_catch):
  39. def catch(func):
  40. def adorner(*args, **kwargs):
  41. try:
  42. return_ = func(*args, **kwargs)
  43. logging.debug(f'run {func.__name__} args:{args} kwargs:{kwargs} return:{return_}')
  44. return return_
  45. except BaseException as e:
  46. logging.error(f'{e} {func.__name__} args:{args} kwargs:{kwargs}')
  47. assert not func.__name__.endswith('_gui'), str(e)
  48. return adorner
  49. return catch
  50. class QueueController:
  51. def __init__(self):
  52. self.in_queue: Queue
  53. self.out_queue: Queue
  54. self.run = True
  55. self.var_dict = {}
  56. self.stop = None
  57. self.before_stop = lambda: None
  58. def set_queue(self, in_queue: Queue, out_queue: Queue):
  59. self.in_queue = in_queue
  60. self.out_queue = out_queue
  61. return self
  62. def set_before_stop(self, func):
  63. self.before_stop = func
  64. def stop_process(self):
  65. self.run = False
  66. self.out_queue.put("__--$$stop_process$$--__")
  67. self.before_stop()
  68. time.sleep(0.5)
  69. def __call__(self, *args, **kwargs):
  70. self.run = True
  71. def done():
  72. while self.run:
  73. if self.in_queue.empty():
  74. continue
  75. get = self.in_queue.get()
  76. try:
  77. assert isinstance(get, str)
  78. name_space = self.var_dict.copy()
  79. name_space.update(globals())
  80. if get.startswith('done '):
  81. exec(get[5:], name_space)
  82. elif get == 'get var_*':
  83. self.out_queue.put(list(name_space.keys()))
  84. elif get == 'get *':
  85. self.out_queue.put(list(self.var_dict.keys()))
  86. elif get.startswith('get_var '):
  87. result = name_space.get(get[8:])
  88. if result == '__--$$stop_process$$--__':
  89. result += '_'
  90. self.out_queue.put(result)
  91. self.var_dict[f'var_{len(self.var_dict)}'] = result
  92. elif get.startswith('get_eval '):
  93. result = eval(get[9:], name_space)
  94. if result == '__--$$stop_process$$--__':
  95. result += '_'
  96. self.out_queue.put(result)
  97. self.var_dict[f'var_{len(self.var_dict)}'] = result
  98. elif get.startswith('file ') and get.startswith('.py'):
  99. with open(get[4:], 'r') as f:
  100. code_file = f.read()
  101. new_name_space = name_space
  102. exec(code_file, new_name_space)
  103. self.var_dict[f'var_{len(self.var_dict)}'] = new_name_space.copy()
  104. except AssertionError:
  105. self.var_dict[f'var_{len(self.var_dict)}'] = get
  106. except BaseException as e:
  107. self.out_queue.put(str(e))
  108. t = threading.Thread(target=done)
  109. t.setDaemon(True)
  110. t.start()