__init__.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import os
  2. import logging
  3. from multiprocessing import Queue
  4. import time
  5. import threading
  6. import traceback
  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:
  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. .replace('\n', '\\n'))
  45. return return_
  46. except BaseException as e:
  47. back = '\n[ERROR]' + traceback.format_exc().replace('\n', '\n[ERROR]')
  48. logging.error(f'{e} {func.__name__} args:{args} kwargs:{kwargs}'.replace('\n', '\\n') + back)
  49. assert not func.__name__.endswith('_gui'), str(e)
  50. return adorner
  51. return catch
  52. class QueueController:
  53. def __init__(self):
  54. self.in_queue = None
  55. self.out_queue = None
  56. self.run = True
  57. self.var_dict = {}
  58. self.stop = None
  59. self.before_stop = lambda: None
  60. def set_queue(self, in_queue: Queue, out_queue: Queue):
  61. self.in_queue = in_queue
  62. self.out_queue = out_queue
  63. return self
  64. def set_before_stop(self, func):
  65. self.before_stop = func
  66. def stop_process(self):
  67. self.run = False
  68. self.out_queue.put("__--$$stop_process$$--__")
  69. self.before_stop()
  70. time.sleep(0.5)
  71. def __call__(self, *args, **kwargs):
  72. self.run = True
  73. def done():
  74. while self.run:
  75. if self.in_queue.empty():
  76. continue
  77. get = self.in_queue.get()
  78. try:
  79. assert isinstance(get, str)
  80. name_space = self.var_dict.copy()
  81. name_space.update(globals())
  82. if get.startswith('done '):
  83. exec(get[5:], name_space)
  84. elif get == 'get var_*':
  85. self.out_queue.put(list(name_space.keys()))
  86. elif get == 'get *':
  87. self.out_queue.put(list(self.var_dict.keys()))
  88. elif get.startswith('get_var '):
  89. result = name_space.get(get[8:])
  90. if result == '__--$$stop_process$$--__':
  91. result += '_'
  92. self.out_queue.put(result)
  93. self.var_dict[f'var_{len(self.var_dict)}'] = result
  94. elif get.startswith('get_eval '):
  95. result = eval(get[9:], name_space)
  96. if result == '__--$$stop_process$$--__':
  97. result += '_'
  98. self.out_queue.put(result)
  99. self.var_dict[f'var_{len(self.var_dict)}'] = result
  100. elif get.startswith('file ') and get.startswith('.py'):
  101. with open(get[4:], 'r') as f:
  102. code_file = f.read()
  103. new_name_space = name_space
  104. exec(code_file, new_name_space)
  105. self.var_dict[f'var_{len(self.var_dict)}'] = new_name_space.copy()
  106. except AssertionError:
  107. self.var_dict[f'var_{len(self.var_dict)}'] = get
  108. except BaseException as e:
  109. self.out_queue.put(str(e))
  110. t = threading.Thread(target=done)
  111. t.setDaemon(True)
  112. t.start()