3 Stimmen

Dynamisches Laden eines Moduls

Ich habe einige Module wie dieses:

    Drivers/
        a.py
        b.py
        c.py

Jetzt möchte ich sie auf der Grundlage eines Variablenwerts aufrufen. Lassen Sie uns annehmen, dass 'driver' die Variable ist, aus der ich den Variablennamen erhalten werde.

    if driver=='a':
        #dann rufe den Treiber a auf und führe aus.
        a.somefunction()
    if driver=='b':
        #dann rufe den Treiber b auf und führe aus

Ich weiß, dass der Wert, den wir aus dem Treiber im If-Statement erhalten, ein String-Typ ist und im If-Statement ein Modul aufgerufen werden muss. Gibt es eine Möglichkeit, es umzuwandeln..??

5voto

Daniel Punkte 41371

Wenn Ihr "Drivers/"-Verzeichnis im Suchpfad von Python liegt, importieren Sie einfach das Modul und rufen Sie die Funktion auf:

import importlib
modul = importlib.import_module(Treiber)
modul.some_function()

2voto

emeth Punkte 5980

Wenn die Module auf der gleichen Ebene sind (genau wie in Ihrem Fall), einfach

module = __import__(driver)
module.somefunction()

driver kann ein String wie 'a', 'b' oder 'c' sein. Wenn das Modul nicht existiert, wird ein ImportError ausgelöst.

1voto

Burhan Khalid Punkte 161333

Hier ist ein anderer Ansatz:

def default_action():
    print('Ich werde dies standardmäßig tun')
    return 42

the_function = default_action 

if driver == 'a':
    from a import somefunction as the_function
if driver == 'b':
    from b import some_other_function as the_function
if driver == 'c':
    from c import some_other_function as the_function

print('Führe den Code aus ... ')
result = the_function()
print('Ergebnis ist: {}'.format(result))

Sie müssen sicherstellen, dass der vollständige Pfad zu Drivers/ in Ihrer PYTHONPATH-Variablen enthalten ist.

0voto

WKPlus Punkte 6466

Oder du kannst das verwenden:

import imp
py_mod = imp.load_module(driver, *imp.find_module(driver, ['Drivers']))

0voto

eiPi10 Punkte 81

Sie sollten hier über den Modulpfadsuchpfad lesen: https://docs.python.org/2/tutorial/modules.html#the-module-search-path

Diese Diskussion zeigt, wie man einen String in einen Befehl umwandelt: http://www.daniweb.com/software-development/python/threads/198082/converting-string-to-python-code

Ein grundlegendes Beispiel für Ihren Fall wäre etwas wie:

Angenommen, a und b sind Verzeichnisse in Linux im Stammverzeichnis

import sys
import os

if driver=='a':
    # Füge /a zum Modulpfadsuchpfad hinzu
    sys.path.append(os.path.join(['/', driver]))

    command_string = 'import ' + driver + '.py'

    # Konvertiert einen String in einen Python-Befehl
    exec(command_string)
    # dann rufe den Treiber a auf und führe aus
    a.somefunction()
if driver=='b':

    sys.path.append(os.path.join(['/', driver]))

    command_string = 'import ' + driver + '.py'

    # Konvertiert einen String in einen Python-Befehl
    exec(command_string)
    # dann rufe den Treiber b auf und führe aus

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X