Ich würde gerne folgendes realisieren: es gibt einen generischen Wrapper, um Hardware anzusprechen; der hat solche Funktionen wie ping, telnet, ssh, etc. die auch simuliert werden können (abhängig von einem Schalter in der Klasse, den man von aussen zur Laufzeit umlegen kann). In einem anderen Verzeichnis (projektX) liegen projektspezifische Erweiterungen, die von GenericWrapper abgeleitet sind, die auch Dinge wie getKernelVersion, getSoftwareVersion etc, die von Projekt zu Projekt unterschiedlich sind, enthalten.
Beim Booten meiner Applikation wird erst mal festgestellt, welches Projekt bearbeitet werden soll und ob eine Simulation gefahren werden soll oder mit der "echten Hardware" kommuniziert werden soll. Dementsprechend soll das passende Modul (z.B. projektXWrapper aus dem Unterverzeichnis projektX) geladen werden und ab jetzt verwendet werden. Zur Laufzeit soll man zwischen Simulation und echter HW umschalten können.
Der GenericWrapper benutzt seinerseits einen GenericSimulator und GenericConnector, die wiederum Basisklassen für projektspezifische Erweiterungen sind.
soweit die Theorie - jetzt zum Code:
Code: Alles auswählen
import sys,os
def create_instance(*args, **kwargs):
module, class_ = args[:2]
cls = getattr(__import__(module, None, None, ['']), class_)
return cls(*args[2:], **kwargs)
def re_import(module_name):
result = sys.modules.get(module_name)
if result is None:
result = __import__(module_name)
else:
reload(result)
class GenericWrapper:
def __init__(self, simMode="OFF", projectPrefix = "projektX"):
self.simulationMode = simMode
self.projectPrefix = projectPrefix
self.executor = None
if self.simulationMode == "ON" :
# executor = simulator class, not yet implemented
#self.executor = re_import(self.projectPrefix + "Simulator")
print "simulation mode"
else:
# executor = connector to real HW, not yet implemented
#self.executor = re_import(self.projectPrefix + "Connector")
print "connection mode"
def pingIt(self):
self.executor.pingIt()
if __name__ == '__main__':
topdir = os.getcwd()
projektExtension = "projektX"
addToPath = os.path.join(topdir,projektExtension)
sys.path.append(addToPath)
print "instantiating projetXWrapper"
nw = create_instance(projektExtension + "Wrapper", projektExtension + "Wrapper", simMode="OFF", projectPrefix = "projektX")
Code: Alles auswählen
import GenericWrapper
class projektXWrapper(GenericWrapper):
def __init__(self, simMode="OFF", projectPrefix = "projektX"):
GenericWrapper.__init__(self, simMode, projectPrefix)
if self.simulationMode == "ON" :
self.executorName = "projektXSimulator"
else:
self.executorName = "projektXConnector"
print "self.executorName = " + self.executorName
Code: Alles auswählen
initialising GenericWrapper
Traceback (most recent call last):
File "F:\tcommander\0.4.4\tests\trial\1\GenericWrapper.py", line 41, in <module>
nw = create_instance(projektExtension + "Wrapper", projektExtension + "Wrapper", simMode="OFF", projectPrefix = "projektX")
File "F:\tcommander\0.4.4\tests\trial\1\GenericWrapper.py", line 5, in create_instance
cls = getattr(__import__(module, None, None, ['']), class_)
File "F:\tcommander\0.4.4\tests\trial\1\projektX\projektXWrapper.py", line 4, in <module>
class projektXWrapper(GenericWrapper):
TypeError: Error when calling the metaclass bases
module.__init__() takes at most 2 arguments (3 given)
danke im voraus