Seite 1 von 1

Dynamisches Nachladen von Modulen

Verfasst: Montag 12. März 2007, 16:01
von aga
Hallo!

Ich hoffe, ihr könnt mir helfen; bitte um Verständnis, da ich mich erst 3 Wochen mit python befasse..;)
Ich möchte folgendes erreichen: es gibt einen Wrapper, der aufgrund eines Eintrags in einer cfg Datei entweder einen Simulator lädt oder den echten Connector zur HW. Das funkt inzwischen (lines 3-21).
Ausserdem soll es die Möglichkeit geben, dasselbe auch zur Laufzeit zu tun - durch einen Aufruf von wrapperReInit. Gewünscht ist, wenn man einen Aufruf "executor.testit()" macht, der je nachdem real.testit() oder simulator.testit() aufruft. Oder gibt's da schon eine einfachere Möglichkeit?

Code: Alles auswählen

global executor
global a
a = "yes"

##################################################
# select the executor due to a configuration value
# in a configuration file (code deleted for clarity)

print "a = " + a
if a is "Yes":
    print "#### using simulator  ####"
    import simulator 
    reload(simulator) 
    executor = simulator
else :
    print "#### using real connector to HW ####"
    import real 
    reload(real) 
    executor = real
    

def wrapperReInit(entityToAttach):
    """ 
    dynamically imports either real or its simulator
    and uses either this or that to execute calls
    """
    print "entityToAttach = " + entityToAttach
    if entityToAttach is "simulator" :
        executor = None
        exec "import simulator"
        __import__("simulator")
        reload(simulator)
        executor = simulator
        print "reloaded simulator"
        return
    if entityToAttach == "real" :
        executor = None        
        print "#### using real connector to HW ####"
        #sys.path.append("/vobs/nexta/src8/lib/libFmSatTest")
        exec "import real" 
        __import__("real")
        reload(real)
        executor = real
        print "reloaded real"
        return
            

def main(): 
     
    input = 1 
    while (input != 0):
        if input==1 :
            wrapperReInit("simulator")            
        else:
            wrapperReInit("real")
        executor.testit()
        input = raw_input('Geben Sie eine Zahl ein: ');
        input = int(input) 

if __name__ == "__main__": 
    main()
danke im voraus

Verfasst: Montag 12. März 2007, 16:26
von BlackJack
Das Hauptproblem in Deinem Quelltext ist das ``global``. Das hat auf Modulebene keinen Effekt. Wäre schön, wenn der Compiler da eine Warnung ausgeben würde.

Aber man sollte ``global`` sowieso so wenig wie möglich benutzen. Und auf keinen Fall ``is`` für Vergleiche zwischen zwei beliebigen Zeichenketten!

Ungetestet:

Code: Alles auswählen

import sys

a = 'Yes'

def re_import(module_name):
    result = sys.modules.get(module_name)
    if result is None:
        result = __import__(module_name)
    else:
        reload(result)
    return result

def main():
    if a == 'Yes':
        executor = re_import('simulator')
    else:
        executor = re_import('real')

    while True:
        user_input = int(raw_input('Geben sie eine Zahl ein: '))
        if user_input == 0:
            break
        if user_input == 1:
            executor = re_import('simulator')
        else:
            executor = re_import('real')
        executor.testit()

Verfasst: Montag 12. März 2007, 18:02
von aga
Danke für die rekordverdächtig schnelle Antwort!
Getestet und funkt!!

danke!

ps: vielleicht sollt ich doch mal doku lesen... :wink: