А что именно у вас вызывает вопросы?
Вы реализовываете функцию, которая принимает текущий контекст, строку команды, и поток для вывода выхлопа.
Если нужно REPL в терминале, то в цикле функцией input запрашиваете команду, передаёте её в выше упомянутую функцию.
Можно сделать не функцию, а класс, тогда он может ъанить в себе контекст текущего состояния вашей командной оболочки и поток для вывода, а функция обработки команды может быть не одна, а много методов, помеченных префиксами или декораторами. так для каждой команды можно свой метод описать, а декораторами можно указывать права доступа к соответствующей команде, какую-то еще специфику.
Если нужны команды с аргументами, ключами, параметрами, с автодокументацией, то можно воспользоваться встроенными библиотеками парсинга командной строки, например optparse, или сторонней развесистой библиотекой, например, click.
Если командная стрроука нужна не в терминале, а, скажем, в браузере, то интерфейс обработки тот же, но в цикле приёма команд вы можете брать их не из stdin, а из веб-сокета или API на flask. Можно создать окно с помощью Tkinter или PySide\PyQt и запрашивать текст команд там. Можно поискать библиотеки реализации расширенных термиальных воможностей, где будет автодополнение, подсказки и прочее.
В целом, судя по вашему вопросу, вам стоит либо остановиться на простейшем REPL в терминале как я написал в начале, либо подучиться немного питону в частности и программированию в целом и тогда этот вопрос у вас уже не встанет, поскольку окажется тривиальным.
Успехов.
Кстати, я не искал, возможно (и даже наверняка) есть готовые продвинутые библиотеки для реализации кастомных REPL питоне. Наверно кто-то подкинет такие варианты в альтернативных ответах.