Динамическая загрузка модулей с одинаковым именем, но разными путямиPython

Программы на Python
Ответить
Anonymous
 Динамическая загрузка модулей с одинаковым именем, но разными путями

Сообщение Anonymous »

Я создаю своего рода загрузчик модов, который автоматически загружает определенные классы с определенной переменной, определенной из любых файлов в папке mods корневых каталогов.
Моя файловая структура выглядит следующим образом:

Код: Выделить всё

mods
- example-mod.iceandfire04
- cats.py
- examplemod.py
- scripts.py
- another-mod.iceandfire04
- cats.py
- anothermod.py
Каждый из файлов мода импортирует свой собственный файл Cats.py, как и import Cats.
Вот часть моего кода (не может включать find_mod_classes или load_mod_info, потому что он был сгенерирован ИИ из-за моего низкого навыка работы с Python, но они печатаются при выполнении):

Код: Выделить всё

        # load selected mods
for mod in iml_lib.find_mod_classes(selected_mods):
if mod.mod_id in selected_mods:
print(f"! Loading mod: {mod.name} ({mod.mod_id})")
iml_lib.load_mod_class(self.tbcml_mod, self.loader, mod)

Код: Выделить всё

def load_mod_class(tbcml_mod: tbcml.Mod, loader: tbcml.ModLoader, mod: IceMod):
"""Load all of the modifications and scripts from a mod class into the given `tbcml.Mod` instance."""

for modification in mod.modifications:
print(f" - Adding modification: {modification.__class__.__name__}")
tbcml_mod.add_modification(modification)
for script in mod.scripts:
print(f" - Adding script: {script.__class__.__name__}")
tbcml_mod.add_script(script)

mod.load(mod, mod=tbcml_mod, loader=loader)
print(f"✔ Loaded mod: {mod.name} ({mod.mod_id})")
Вот моды, урезанные до базовых:

Код: Выделить всё

class ExampleMod(iml_lib.IceMod):
name = "Example Mod"
mod_id = "example-mod.iceandfire04"

modifications = [cats.CustomCat()]
scripts = [scripts.AntibanScript()]

def load(self, loader: tbcml.ModLoader, mod: tbcml.Mod):
super().load(self, loader=loader, mod=mod)
print("Example Mod: You can put custom loading code here if needed!")

Код: Выделить всё

class AnotherMod(iml_lib.IceMod):
name = "Another Mod"
mod_id = "another-mod.iceandfire04"

modifications = [cats.AnotherCat()]
scripts = []

def load(self, loader: tbcml.ModLoader, mod: tbcml.Mod):
super().load(self, loader=loader, mod=mod)
print("Another Mod: yeah, you can add stuff here too")
Это весь мой поток ошибок:

Код: Выделить всё

load_mod_info executed.
load_mod_info executed.
load_mod_info executed.
load_mod_info executed.
load_mod_info executed.
Failed to load examplemod.py: module 'cats' has no attribute 'CustomCat'
load_mod_info executed.
Добавление __init__.py и переименование всех папок не работает, и я не хочу особо беспокоиться о пакетах Python, если они не являются абсолютно необходимыми.
Чтобы уточнить немного больше о load_mod_info, он сканирует любой файл .py на предмет их классов и проверяет, имеет ли он те же переменные, что и мод. Оттуда он создает и возвращает словарь информации о моде. Он делает это с помощью sys и importlib, объединяет имя родительской папки и исключает недопустимые символы, такие как тире или точки.
Итак, мой последний вопрос: как я могу предотвратить, чтобы эти модули, такие как Cats.py, не рассматривались как друг друга? Как уже было сказано, я пока не очень хорошо разбираюсь в Python, поэтому буду рад любым разработкам, выходящим за рамки базовых принципов.

Подробнее здесь: https://stackoverflow.com/questions/798 ... rent-paths
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»