R. F. schrieb:
> Ich habe bisher folgendes herausgefunden:
>
>
1 | > from pathlib import Path
|
2 | >
|
3 | > my_file=Path("./Haus.py")
|
4 | >
|
5 | > if my_file.is_file():
|
6 | > import Haus
|
7 | > Haus.ausgabe()
|
8 | >
|
>
> Das funktioniert ohne Probleme.
Äh, nein, das tut es nicht, fürchte ich. Das funktioniert nur deswegen,
weil die Datei "Haus.py" im aktuellen Verzeichnis liegt -- und Dir der
Modulname "Haus" bekannt ist.
Bevor ich Dir allerdings die Lösung für Dein Problem zeige, möchte ich
gerne kurz darauf hinweisen, daß es vermutlich einfacher wäre, wenn Du
Deine einzelnen Häuser erstens sprechender benennen würdest und
obendrein anstelle von Python-Modulen für Deine Häuser eine
Konfigurationsdatei benutzen würdest. Python bringt dazu bereits fertige
Module mit, zum Beispiel json für JSON-Dateien, oder configparser für
ini-Dateiformate. In solchen Konfigurationsdateien kannst Du allerdings
keinen Code hinterlegen und ausführen (mit ein paar häßlichen Tricks
geht's schon, aber...). Allerdings sagst Du ja, daß Du die Dateien nur
kopierst, insofern nehme ich mal an, daß die meisten Deiner Module
denselben Code enthalten und die Unterschiede sich vermutlich relativ
einfach über Konfigurationsdateien darstellen lassen.
Es ist allerdings auch möglich, Module zu laden, deren Namen lediglich
als String vorliegen. Eine Plugin-basierte Software von mir macht das im
Kern etwa so:
1 | modules_dir = os.path.join(
|
2 | os.path.dirname(os.path.abspath(__file__)), MODULES_DIR)
|
3 | sys.path.append(modules_dir)
|
4 | for modulefile in os.listdir(modules_dir):
|
5 | modulename, _ = os.path.splitext(modulefile)
|
6 | if modulename != '__pycache__':
|
7 | try:
|
8 | mod = importlib.import_module(modulename)
|
9 | mod.register(subparser, modulename)
|
10 | except:
|
11 | logging.exception(
|
12 | 'while loading module "%s":\n'%(modulename),
|
13 | exc_info=sys.exc_info()
|
14 | )
|
15 | sys.exit(-4)
|
Dabei besitzt jedes Modul in meinem "modules_dir" jeweils eine Funktion
"register()" und eine Funktion "main()", die alle dieselben Parameter
entgegennehmen. Dabei sorgt "register()" dafür, daß die
Kommandozeilenargumente des Plugin im ArgumentParser des Hauptprogramms
angemeldet werden, während "main()" die eigentliche Arbeit macht.
Die Module können dabei Dateien "<modulname>.py" oder Verzeichnisse
"<modulname>" mit einer Datei "__init__.py" darin sein, wichtig ist
dabei nur, daß die Datei beziehungsweise eine "__init__.py"-Datei die
betreffenden Funktionen mit ihrer korrekten Signatur zur Verfügung
stellen.
Wichtig natürlich auch: das Verzeichnis mit den Modulen muß zum Suchpfad
des Interpreters hinzugefügt werden, hier mit "sys.path.append()".