Создание вложенного 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()
предпочтение простому атрибуту доступа к динамически импортируемому модулю расширения.