-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDynamicSystem.py
50 lines (39 loc) · 1.77 KB
/
DynamicSystem.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import glob
import importlib
import json
import sys
import os
class DynamicSystem(object):
def __init__(self, **kwargs) -> None:
self.processes = {}
self.LoadProcesses(self.getProcessPath(), **kwargs)
def getProcessPath(self):
return ""
def LoadProcesses(self, processPath, **kwargs):
cwd = os.getcwd()
workPath = os.path.join(cwd, processPath)
pattern = "*.py"
fileList = glob.glob(os.path.join(workPath, pattern))
if fileList: # If list is not empty
abstractModuleName = list(filter(lambda x: os.path.basename(x).startswith('_')
and not '__init__.py' in x, fileList))
concreteModules = list(filter(lambda x: not os.path.basename(x).startswith('_'), fileList))
if(abstractModuleName):
abstractModuleName = abstractModuleName[0]
#abstractModule = os.path.splitext(os.path.basename(abstractModule))[0]
abstractProcName = os.path.splitext(os.path.basename(abstractModuleName))[0]
abstractSpec = importlib.util.spec_from_file_location(abstractProcName, abstractModuleName)
abstractModule = importlib.util.module_from_spec(abstractSpec)
abstractSpec.loader.exec_module(abstractModule)
sys.modules[abstractProcName] = abstractModule
for fileName in concreteModules:
procName = os.path.splitext(os.path.basename(fileName))[0]
module = importlib.import_module(processPath+"."+procName)
cls = getattr(module, procName)
cfg = fileName.replace(".py", ".config")
kwargs = {}
if(os.path.isfile(cfg)):
kwargs = json.load(open(cfg))
kwargs["system"]=self
procObject = cls(**kwargs)
self.processes[procName] = procObject