modInfo.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import os
  4. import importlib
  5. import sys
  6. class modInfo(object):
  7. def __init__(self, path:str,className:str, classPath:str):
  8. print("Load Module: " + classPath)
  9. self._loaded = False
  10. self._size = 0
  11. self._path = ""
  12. self._mod = None
  13. self._className = className
  14. self._classPath = classPath
  15. #self.Path = path
  16. self.__setPath(path)
  17. def __del__(self):
  18. self.Unload()
  19. del self._loaded
  20. del self._mod
  21. del self._path
  22. del self._size
  23. del self._className
  24. del self._classPath
  25. def Unload(self):
  26. #TODO realy unload the module
  27. if self._loaded == False:
  28. return
  29. self._loaded = False
  30. def Execute(self, methode:str, arg1 = None, arg2 = None,arg3 = None):
  31. if self._loaded == False:
  32. return
  33. isActive = getattr(self._instance, "IsActive")
  34. if isActive():
  35. methode = getattr(self._instance, methode)
  36. if methode:
  37. if arg1 == None and arg2==None and arg3 == None:
  38. methode()
  39. elif arg2 == None and arg3 == None:
  40. methode(arg1)
  41. elif arg3 == None:
  42. methode(arg1, arg2)
  43. else:
  44. methode(arg1, arg2, arg3)
  45. def _loadModule(self, moduleName:str):
  46. module = None
  47. moduleName = self._classPath + "." + self._className
  48. #print("- moduleName: " + moduleName)
  49. try:
  50. del sys.modules[moduleName]
  51. except BaseException as err:
  52. pass
  53. try:
  54. #print("try to import module "+moduleName)
  55. module = importlib.import_module(moduleName)
  56. except BaseException as err:
  57. serr = str(err)
  58. print("Error loading module '" + moduleName + "': " + serr)
  59. return module
  60. def _reloadModule(self, moduleName):
  61. module = self.loadModule(moduleName)
  62. moduleName = moduleName.replace("/",".")
  63. moduleName, modulePath = str(module).replace("' from '", "||").replace("<module '", '').replace("'>", '').split("||")
  64. if (modulePath.endswith(".pyc")):
  65. import os
  66. os.remove(modulePath)
  67. module = self.loadModule(moduleName)
  68. return module
  69. @property
  70. def Path(self):
  71. return self._path
  72. @Path.setter
  73. def Path(self,value):
  74. self.__setPath(value)
  75. @property
  76. def Size(self):
  77. return self._size
  78. @property
  79. def Module(self):
  80. return self._mod
  81. @property
  82. def Loaded(self):
  83. return self._loaded
  84. def __setPath(self, value):
  85. if self._path == value:
  86. return
  87. self.Unload()
  88. if value == "":
  89. return
  90. self._path = value
  91. if os.path.isfile(value):
  92. #print("- file exists")
  93. self._size = os.path.getsize(self._path)
  94. #print("- size: " + str(self._size))
  95. try:
  96. #self._mod = __import__(self._path)
  97. self._mod = self._loadModule(self._path)
  98. #print("- _loadModule("+self._path+") done")
  99. self._instance = getattr(self._mod, self._className)()
  100. if self._instance==None:
  101. #print("- failed to create instance")
  102. self._loaded = False
  103. else:
  104. #print("instance created")
  105. self._loaded = True
  106. #print("- loaded done")
  107. except ImportError:
  108. print("- ImportError")
  109. self._mod = None
  110. self._loaded = False
  111. else:
  112. print("- Not found")
  113. self._mod = None
  114. self._loaded = False
  115. self._size = 0