Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

1

21.12.2016, 06:48

Python | Plugin-System

Hi,
für ein Python-Projekt möchte ich ein PlugIn-System umsetzen.
Leider scheitere ich beim importieren der Skripts.

Hierbei nutze ich folgende Ordnerhierachie:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
   xbt.py <- Definiert den Einstiegspunkt des Programmes
   Engine/
       __init__.py
       Item.py
       Extension.py
       Ext/
           Extension1.py
           Extension2.py


Laut Python Doc's soll ich "importlib.import_module" nutzen.
Dabei gehe ich wie folgt vor:

C-/C++-Quelltext

1
2
    for files in os.listdir("Ext"):
        importlib.import_module(files, "Engine.Ext")


Leider bekomme ich stehts den Fehler "No module named Extension...".

Wie kann ich in Python 3 ein Plugin laden?
Die Plugin's sind als einfach Klasse definiert, die zwei statische Methoden hat.

LG Julien
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Julién« (21.12.2016, 07:14)


xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

2

21.12.2016, 22:50

Ich vermute mal, dass du in Ext/ auch eine __init__.py brauchst.

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

3

23.12.2016, 00:48

Ich habe es zum Glück lösen können. (Ohne ein __init__.py)

C-/C++-Quelltext

1
2
3
4
5
            for file in os.listdir("Engine/Toolchains"):
            if file.endswith(".py"):
                module  = importlib.import_module('Engine.Toolchains.{0}'.format(file[:-3]))
                ext     = getattr(module, file[:-3])
                self.extensionList.append(ext)


Das "Import"-System von Python ist anfangs ziemlich unverständlich,
aber sobald man einmal durchblickt, scheint alles logisch zu sein :b
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

23.12.2016, 01:50

Ich würde dir empfehlen dich genauer mit diesem Import System (Modulen) zu beschäftigen, denn das hier sieht ziemlich fragwürdig aus. __init__.py files in Ordner (Packages) zu legen ist komplett normal, akzeptiert und der Standardweg, wie man das machen würde.

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

5

23.12.2016, 04:40

Es würde hier keinen Unterschied machen, ob eine '__init__.py' Datei in diesem Ordner vorhanden ist,
oder nicht. Beides funktioniert, da ich diese Module dynamisch lade.

Ich glaube, dass ich dich falsch verstehe. Was meinst du mit "Standardweg"?
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

23.12.2016, 20:51

Kommt halt sehr drauf an ob du die Files wirklich so laden musst oder nicht einfach das Python Modul System benutzen kannst.

Müssen denn die Extensions irgendwie zur Laufzeit (nachdem das ganze verpackt wurde) geladen werden? Wenn nein, sieht das für mich ein wenig komisch aus die per Filesystem direkt "von Hand" zu laden.

Sofern kein guter Grund vorliegt das anders zu machen, würde ich ganz normale Packages machen und sie so laden wie es hier beschrieben ist.

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

7

25.12.2016, 02:00

Tatsächlich sollen die zur Laufzeit geladen werden.
Das Vorhanden sein der Extensions ist vorher nicht bekannt.
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Werbeanzeige