Интерактивный режим интерпретатора MicroPython (он же REPL)

В этом разделе рассматриваются некоторые особенности интерактивного режима интерпретатора MicroPython. Часто используемый для него термин — REPL (read-eval-print-loop, цикл «чтение-вычисление-вывод»), который и будет применяться для обозначения этого интерактивного приглашения.

Примечание

OpenMV Cam предоставляет этот REPL через свой последовательный (CDC) USB-порт. Он актуален только тогда, когда вы подключаетесь к камере напрямую с помощью эмулятора последовательного терминала (или такого инструмента, как Удалённое управление MicroPython: mpremote). OpenMV IDE не использует REPL — она взаимодействует с камерой по отдельному отладочному протоколу для запуска скриптов, передачи файлов и потоковой передачи буфера кадра. Всё, что описано на этой странице, относится только к прямым сеансам работы через терминал.

Автоматический отступ

При вводе операторов Python, заканчивающихся двоеточием (например, if, for, while), приглашение изменится на три точки (…), а курсор будет смещён на 4 пробела. Когда вы нажмёте Enter, следующая строка продолжится с тем же уровнем отступа для обычных операторов или с дополнительным уровнем отступа там, где это уместно. Если вы нажмёте клавишу Backspace, то отмените один уровень отступа.

Если ваш курсор находится в самом начале, нажатие RETURN выполнит введённый вами код. Ниже показано, что вы увидите после ввода оператора for (подчёркивание показывает, где оказывается курсор):

>>> for i in range(30):
...     _

Если затем ввести оператор if, будет предоставлен дополнительный уровень отступа:

>>> for i in range(30):
...     if i > 3:
...         _

Теперь введите break, за которым следует RETURN, и нажмите BACKSPACE:

>>> for i in range(30):
...     if i > 3:
...         break
...     _

Наконец, введите print(i), нажмите RETURN, нажмите BACKSPACE и снова нажмите RETURN:

>>> for i in range(30):
...     if i > 3:
...         break
...     print(i)
...
0
1
2
3
>>>

Автоматический отступ не будет применён, если две предыдущие строки полностью состояли из пробелов. Это означает, что вы можете завершить ввод составного оператора, дважды нажав RETURN, а третье нажатие завершит ввод и выполнит код.

Автодополнение

При вводе команды в REPL, если набранная к этому моменту строка соответствует началу имени чего-либо, нажатие TAB покажет возможные варианты, которые можно ввести. Например, сначала импортируйте модуль machine, введя import machine и нажав RETURN. Затем введите m и нажмите TAB — строка должна развернуться до machine. Введите точку . и снова нажмите TAB. Вы должны увидеть что-то вроде:

>>> machine.
__name__        info            unique_id       reset
bootloader      freq            rng             idle
sleep           deepsleep       disable_irq     enable_irq
Pin

Слово будет развёрнуто настолько, насколько это возможно, пока не появится несколько вариантов. Например, введите machine.Pin.PULL и нажмите TAB — строка развернётся до machine.Pin.PULL_. Второе нажатие TAB покажет возможные варианты дополнения:

>>> machine.Pin.PULL_
PULL_DOWN       PULL_UP
>>> machine.Pin.PULL_

Прерывание выполняющейся программы

Вы можете прервать выполняющуюся программу, нажав Ctrl-C. Это вызовет исключение KeyboardInterrupt, которое вернёт вас в REPL, при условии что ваша программа не перехватывает исключение KeyboardInterrupt.

Например:

>>> for i in range(1000000):
...     print(i)
...
0
1
2
3
...
6466
6467
6468
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
KeyboardInterrupt:
>>>

Режим вставки

Если вы хотите вставить код в окно терминала, функция автоматического отступа всё испортит. Например, если бы у вас был следующий код на Python:

def foo():
    print('This is a test to show paste mode')
    print('Here is a second line')
foo()

и вы попытаетесь вставить его в обычный REPL, то увидите что-то вроде этого:

>>> def foo():
...         print('This is a test to show paste mode')
...             print('Here is a second line')
...             foo()
...
Traceback (most recent call last):
  File "<stdin>", line 3
IndentationError: unexpected indent

Если вы нажмёте Ctrl-E, то войдёте в режим вставки, который по сути отключает функцию автоматического отступа и изменяет приглашение с >>> на ===. Например:

>>>
paste mode; Ctrl-C to cancel, Ctrl-D to finish
=== def foo():
===     print('This is a test to show paste mode')
===     print('Here is a second line')
=== foo()
===
This is a test to show paste mode
Here is a second line
>>>

Режим вставки позволяет вставлять пустые строки. Вставленный текст компилируется так, как если бы он был файлом. Нажатие Ctrl-D выходит из режима вставки и запускает компиляцию.

Программный сброс

Программный сброс сбросит интерпретатор Python, но постарается не сбрасывать способ, которым вы подключены к OpenMV Cam (USB).

Вы можете выполнить программный сброс из REPL, нажав Ctrl-D, или из вашего кода на Python, выполнив:

machine.soft_reset()

Например, если вы сбросите OpenMV Cam и выполните команду dir(), вы увидите что-то вроде этого:

>>> dir()
['__name__']

Теперь создайте несколько переменных и повторите команду dir():

>>> i = 1
>>> j = 23
>>> x = 'abc'
>>> dir()
['j', 'x', '__name__', 'i']
>>>

Теперь, если вы введёте Ctrl-D и повторите команду dir(), вы увидите, что ваши переменные больше не существуют:

MPY: sync filesystems
MPY: soft reboot
MicroPython v1.25.0 on 2025-05-15; OpenMV Cam H7 with STM32H743
Type "help()" for more information.
>>> dir()
['__name__']
>>>

Дополнительную информацию о типах сброса и процессе запуска см. в Последовательность сброса и загрузки.

Специальная переменная _ (подчёркивание)

При работе в REPL вы можете выполнять вычисления и видеть результаты. MicroPython сохраняет результат предыдущего оператора в переменной _ (подчёркивание). Таким образом, вы можете использовать подчёркивание, чтобы сохранить результат в переменной. Например:

>>> 1 + 2 + 3 + 4 + 5
15
>>> x = _
>>> x
15
>>>

Сырой режим и режим сырой вставки

Сырой режим (также называемый сырым REPL) — это не то, что обычно использует человек. Он предназначен для программного использования и по сути ведёт себя как режим вставки с отключённым эхом и с дополнительным управлением потоком.

Сырой режим активируется с помощью Ctrl-A. Затем вы отправляете свой код на Python, за которым следует Ctrl-D. Ctrl-D будет подтверждён ответом «OK», после чего код на Python будет скомпилирован и выполнен. Любой вывод (или ошибки) будут отправлены обратно. Ввод Ctrl-B выйдет из сырого режима и вернёт обычный (он же дружественный) REPL.

Режим сырой вставки — это дополнительный режим внутри сырого REPL, который включает управление потоком и компилирует код по мере его получения. Это делает его более надёжным для высокоскоростной передачи кода в устройство, а также он использует меньше RAM при приёме, поскольку ему не нужно хранить точную копию кода перед компиляцией (в отличие от стандартного сырого режима).

Режим сырой вставки использует следующий протокол:

  1. Войдите в сырой REPL как обычно с помощью ctrl-A.

  2. Запишите 3 байта: b"\x05A\x01" (то есть ctrl-E, затем «A», затем ctrl-A).

  3. Прочитайте 2 байта, чтобы определить, вошло ли устройство в режим сырой вставки:

    • Если результат равен b"R\x00", то устройство понимает команду, но не поддерживает сырую вставку.

    • Если результат равен b"R\x01", то устройство поддерживает сырую вставку и вошло в этот режим.

    • В противном случае результатом должно быть b"ra", и устройство не поддерживает сырую вставку, а строку b"w REPL; CTRL-B to exit\r\n>" следует прочитать и отбросить.

  4. Если устройство находится в режиме сырой вставки, то продолжайте, в противном случае вернитесь к стандартному сырому режиму.

  5. Прочитайте 2 байта — это приращение размера окна управления потоком (в байтах), хранящееся в виде 16-битного беззнакового целого с порядком байтов little endian. Начальное значение переменной оставшегося размера окна должно быть установлено равным этому числу.

  6. Запишите код в устройство:

    • Пока есть байты для отправки, записывайте до количества байтов, равного оставшемуся размеру окна, и уменьшайте оставшийся размер окна на количество записанных байтов.

    • Если оставшийся размер окна равен 0 или есть байт, ожидающий чтения, прочитайте 1 байт. Если этот байт равен b"\x01", то увеличьте оставшийся размер окна на приращение размера окна из шага 5. Если этот байт равен b"\x04", то устройство хочет завершить приём данных, и b"\x04" следует записать в устройство, после чего больше код не отправлять. (Примечание: если есть байт, ожидающий чтения из устройства, то его не обязательно читать и обрабатывать немедленно — устройство продолжит потреблять входящие байты, пока оставшийся размер окна больше 0.)

  7. Когда весь код записан в устройство, запишите b"\x04", чтобы указать конец данных.

  8. Читайте из устройства, пока не будет получен b"\x04". В этот момент устройство получило и скомпилировало весь отправленный код и выполняет его.

  9. Устройство выводит любые символы, производимые выполняющимся кодом. Когда (если) код завершится, будет выведен b"\x04", за которым следует любое неперехваченное исключение, а затем снова b"\x04". После этого оно возвращается к стандартному сырому REPL и выводит b">".

Например, начиная с новой строки в обычном (дружественном) REPL, если вы запишете:

b"\x01\x05A\x01print(123)\x04"

Тогда устройство ответит чем-то вроде:

b"\r\nraw REPL; CTRL-B to exit\r\n>R\x01\x80\x00\x01\x04123\r\n\x04\x04>"

Разбитое по времени, это выглядит так:

# Step 1: enter raw REPL
write: b"\x01"
read: b"\r\nraw REPL; CTRL-B to exit\r\n>"

# Step 2-5: enter raw-paste mode
write: b"\x05A\x01"
read: b"R\x01\x80\x00\x01"

# Step 6-8: write out code
write: b"print(123)\x04"
read: b"\x04"

# Step 9: code executes and result is read
read: b"123\r\n\x04\x04>"

В данном случае приращение размера окна управления потоком равно 128, и в начале сразу доступно данных на два окна — одно из начального значения приращения размера окна и одно из явного значения b"\x01", которое отправляется. Это означает, что в начале можно записать до 256 байт, прежде чем ждать или проверять наличие новых входящих символов управления потоком.

Инструмент Удалённое управление MicroPython: mpremote использует сырой REPL, включая режим сырой вставки, для выполнения кода на Python на OpenMV Cam.