Python Modul aus String mit Code importieren?

1 Antwort

Du willst also ein Problem, über das du nicht bereit bist im Detail darüber zu sprechen mit einer unsicheren und unwartbaren Programmiermethode lösen und gestattest dann nicht einmal, die Gründe zu hinterfragen? Ich bin mir sicher, es gibt bestimmt eine andere, bessere Vorgehensweise um dein Ziel zu erreichen. Solange dieses aber nicht klar ist ...

Aufgrund Aussagen wie:

fragt einfach nicht wieso, das ist kompliziert und nicht relevant

bin ich raus

Wenn du doch mit dem Kopf durch die Wand willst, vergiss die importlib, die brauchst du nicht. Es gibt die exec() Funktion:

https://www.programiz.com/python-programming/methods/built-in/exec

Woher ich das weiß:Berufserfahrung – Berufserfahrung

3weissgruen 
Fragesteller
 07.01.2024, 18:37

Exec wäre problematisch, da ich ja mehrere Module mit gleich benannten Methoden habe <3

Ich hab's inzwischen aber auch selber geschafft!

import importlib.abc
import importlib.util

# Der Code von Skript A als String
script_code = """
def say_hello():
    print("Hallo von Skript A!")
"""

# Ein Dummy-Modulnamen erstellen
module_name = 'temp_module'

# Eine Klasse erstellen, die die InspectLoader-Methode implementiert
class StringLoader(importlib.abc.InspectLoader, importlib.abc.Loader):
    def create_module(self, spec):
        return None

    def exec_module(self, module):
        code = self.source_to_code(script_code)
        exec(code, module.__dict__)

    def get_code(self, fullname):
        return self.source_to_code(script_code)

    def get_source(self, fullname):
        return script_code

    def load_module(self, fullname):
        spec = importlib.util.spec_from_loader(fullname, self)
        module = importlib.util.module_from_spec(spec)
        self.exec_module(module)
        return module

# Ein Modul erstellen
loader = StringLoader()
temp_module = loader.load_module(module_name)

# Die Funktion aus dem importierten Modul aufrufen
temp_module.say_hello()

(Falls jemand in Zukunft hierüber stolpert, bitte sehr)

0