Имитация интерактивного режима Python

#python #read-eval-print-loop #simulate

#python #цикл чтения-оценки-печати #имитировать

Вопрос:

Я пишу частный онлайн-интерпретатор Python для VK, который бы точно имитировал простаивающую консоль. Только я и некоторые люди из белого списка смогут использовать эту функцию, никакого небезопасного кода, который может нанести вред моему серверу. Но у меня небольшая проблема. Например, я отправляю строку с кодом def foo(): , и я не хочу получать SyntaxError , а продолжаю определять функцию построчно, не записывая длинные строки с использованием n . exec() и eval() в этом случае меня не устраивает. Что я должен использовать, чтобы получить желаемый эффект? Извините, если дублирую, все еще не понимаю из похожих вопросов.

Ответ №1:

Стандартная библиотека Python предоставляет модули code и codeop , которые помогут вам в этом. code Модуль просто имитирует стандартный интерактивный интерпретатор:

 import code
code.interact()
 

Он также предоставляет несколько возможностей для более детального контроля и настройки того, как это работает.

Если вы хотите создать что-то из более простых компонентов, codeop модуль предоставляет компилятор команд, который запоминает __future__ инструкции и распознает неполные команды:

 import codeop
compiler = codeop.CommandCompiler()

try:
    codeobject = compiler(some_source_string)
    # codeobject is an exec-utable code object if some_source_string was a
    # complete command, or None if the command is incomplete.
except (SyntaxError, OverflowError, ValueError):
    # If some_source_string is invalid, we end up here.
    # OverflowError and ValueError can occur in some cases involving invalid literals.
 

Ответ №2:

Это сводится к чтению входных данных, затем

 exec <code> in globals,locals
 

в бесконечном цикле.

См., Например IPython.frontend.terminal.console.interactiveshell.TerminalInteractiveSh
ell.mainloop()
.

Обнаружение продолжения выполняется inputsplitter.push_accepts_more() путем попытки ast.parse() .

На самом деле, у IPython уже есть интерактивная веб-консоль под названием Jupyter Notebook, поэтому лучше всего использовать ее повторно.