Создание вложенного Cmd-интерпретатора в Python

Привет я ищу, чтобы создать вложенный интерпретатор в Python с помощью модуля Cmd.

Я настроил динамическую загрузку модуля, потому что я хочу, чтобы мой проект легко расширялся (т.е. добавлял новый файл python в папку и не меняя основной код, чтобы иметь возможность его загружать).

Мой вложенный интерпретатор в настоящее время настроен так:

def instantiateConsole(base):

    class SubConsole(cmd.Cmd, base):
        def __init__(self):
            cmd.Cmd.__init__(self)

        def do_action(self,args):
            print "Action"
    return SubConsole

Это необходимо, потому что для создания вложенного интерпретатора мне нужно передать MainConsole в качестве второй переменной в класс SubConsole. Проблема в том, что таким образом я могу создавать классы только внутри этого метода, и я не смогу добавить новый файл консольного модуля, который я могу загружать динамически, не имея определения внутри этого метода.

Есть ли обходной путь к этому?

1 ответ

Когда вы говорите "передать MainConsole как вторую переменную", вы подразумеваете "сделать новый SubConsole подклассом MainConsole". Вы эффективно определяете фабрику классов, которая принимает базовый класс в качестве аргумента.

Вы говорите "создать классы внутри этого метода", но instantiateConsole в функции, это появляется. Важно быть осторожным с терминологией.

Это не имеет ничего общего с динамическим импортом (содержащих модули) других базовых классов, которые вы можете использовать в качестве аргументов для instantiateClass, В простейшем случае вы можете просто добавить стандартный каталог, где эти модули будут жить в вашем sys.pathимпортируйте модуль по имени, а затем извлеките базовый класс (который, я предполагаю, для простоты всегда будет определяться как BaseConsole). Затем вы должны запустить такой код, как

extension_module = importlib.import_module("my_extension")
new_console = instantiateConsole(extension_module.BaseConsole)

Если имя базового класса может различаться (как бы вы определили его имя?), Вам, возможно, придется использовать getattr() предпочтение простому атрибуту доступа к динамически импортируемому модулю расширения.

Другие вопросы по тегам