Dynamisches Nachladen von Modulen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
aga
User
Beiträge: 18
Registriert: Montag 12. März 2007, 15:36

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
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()
aga
User
Beiträge: 18
Registriert: Montag 12. März 2007, 15:36

Danke für die rekordverdächtig schnelle Antwort!
Getestet und funkt!!

danke!

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