load_plugins.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import os
  2. import importlib.util
  3. import sys
  4. # import custom_plugins
  5. class LoadAllPlugins(object):
  6. def __init__(self, windows):
  7. self.windows = windows
  8. self.ignore_files = ["get_remote_has256.py", "__init__.py"]
  9. self.ignore_dirs = ["other_micropython_code", "__pycache__"]
  10. def send_log(self, text):
  11. if self.windows:
  12. self.windows.send_log(text)
  13. def load_plugins(self, plugin_dir):
  14. """
  15. 递归加载插件目录下的所有包和模块。
  16. """
  17. plugin_modules = {}
  18. # 获取插件目录的绝对路径
  19. plugin_dir_abs = os.path.abspath(plugin_dir)
  20. print("22 plugin_dir_abs", plugin_dir_abs)
  21. # # 如果插件目录不在sys.path中,则添加它
  22. if plugin_dir_abs not in sys.path:
  23. sys.path.append(plugin_dir_abs)
  24. def load_module_from_file(module_name, file_path):
  25. try:
  26. spec = importlib.util.spec_from_file_location(module_name, file_path)
  27. module = importlib.util.module_from_spec(spec)
  28. spec.loader.exec_module(module)
  29. print(f"Loaded module Successful: {module_name}")
  30. self.send_log(f"Loaded module Successful: {module_name}")
  31. return module
  32. except Exception as e:
  33. print(f"Failed to load module {module_name}: {e}")
  34. self.send_log(f"Failed to load module {module_name}: {e}")
  35. return None
  36. def traverse_directory(directory):
  37. for root, dirs, files in os.walk(directory):
  38. f = True
  39. for i in self.ignore_dirs:
  40. if i in root:
  41. f = False
  42. break
  43. if f is False:
  44. continue
  45. # 确保当前目录被视为Python包
  46. init_file = os.path.join(root, '__init__.py')
  47. if not os.path.isfile(init_file):
  48. open(init_file, 'a').close() # 创建空的 __init__.py 文件
  49. # 加载当前目录下的所有 .py 文件(不包括 __init__.py)
  50. for file in files:
  51. if file in self.ignore_files:
  52. continue
  53. if file.endswith('.py'):
  54. module_name = \
  55. os.path.relpath(os.path.join(root, file), plugin_dir).replace(os.sep, '.').rsplit('.', 1)[0]
  56. module = load_module_from_file(module_name, os.path.join(root, file))
  57. if module is not None:
  58. plugin_modules[module_name] = module
  59. # 遍历插件目录,寻找所有的包和模块
  60. traverse_directory(plugin_dir_abs)
  61. return plugin_modules
  62. def do_load(self, root):
  63. plugin_b_dir = r"{}/custom_plugins".format(os.getcwd())
  64. if plugin_b_dir not in sys.path:
  65. sys.path.insert(0, plugin_b_dir)
  66. plugins_dict = {"detail_template": {},
  67. "ampy_scribe": {},
  68. "generate_scribe": {},
  69. }
  70. self.load_plugins(plugin_dir="{}\custom_plugins/plugins_mode".format(root))
  71. plugins = self.load_plugins(plugin_dir="{}\custom_plugins/plugins".format(root))
  72. for i, py_file in plugins.items():
  73. print(i)
  74. if hasattr(py_file, 'plugins_name'):
  75. if py_file.plugins_name == "详情模板":
  76. company_name_list = py_file.company_name_list
  77. template_name = py_file.template_name
  78. # 一个模板文件可能适合多个不同的企业
  79. if "全部" in company_name_list:
  80. company_name_list = ["全部"]
  81. for company_name in company_name_list:
  82. if company_name not in plugins_dict["detail_template"]:
  83. plugins_dict["detail_template"][company_name] = {}
  84. plugins_dict["detail_template"][company_name][template_name] = py_file.DetailPicGet
  85. if py_file.plugins_name == "AMPY插件":
  86. plugins_dict["ampy_scribe"]["AMPY插件"] = py_file.RemoteUpdate
  87. # if py_file.plugins_name == "主图生成与上传":
  88. # plugins_dict["generate_scribe"]["主图生成与上传"] = py_file.AutoDealPics
  89. return plugins_dict
  90. def load(self):
  91. print("Loading plugins...")
  92. plugins_dict = {}
  93. try:
  94. plugins_dict = self.do_load(root=os.getcwd())
  95. except BaseException as e:
  96. print(e)
  97. self.send_log("Loading plugins. error {}".format(e))
  98. # print(plugins_dict)
  99. # _class = plugins_dict["detail_template"]["小苏"]["xiaosushuoxie-1"]
  100. # _class()
  101. return plugins_dict
  102. if __name__ == '__main__':
  103. LoadAllPlugins(None).load()