Интерактивный режим интерпретатора 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 при приёме, поскольку ему не нужно хранить точную копию кода перед компиляцией (в отличие от стандартного сырого режима).
Режим сырой вставки использует следующий протокол:
Войдите в сырой REPL как обычно с помощью ctrl-A.
Запишите 3 байта:
b"\x05A\x01"(то есть ctrl-E, затем «A», затем ctrl-A).Прочитайте 2 байта, чтобы определить, вошло ли устройство в режим сырой вставки:
Если результат равен
b"R\x00", то устройство понимает команду, но не поддерживает сырую вставку.Если результат равен
b"R\x01", то устройство поддерживает сырую вставку и вошло в этот режим.В противном случае результатом должно быть
b"ra", и устройство не поддерживает сырую вставку, а строкуb"w REPL; CTRL-B to exit\r\n>"следует прочитать и отбросить.
Если устройство находится в режиме сырой вставки, то продолжайте, в противном случае вернитесь к стандартному сырому режиму.
Прочитайте 2 байта — это приращение размера окна управления потоком (в байтах), хранящееся в виде 16-битного беззнакового целого с порядком байтов little endian. Начальное значение переменной оставшегося размера окна должно быть установлено равным этому числу.
Запишите код в устройство:
Пока есть байты для отправки, записывайте до количества байтов, равного оставшемуся размеру окна, и уменьшайте оставшийся размер окна на количество записанных байтов.
Если оставшийся размер окна равен 0 или есть байт, ожидающий чтения, прочитайте 1 байт. Если этот байт равен
b"\x01", то увеличьте оставшийся размер окна на приращение размера окна из шага 5. Если этот байт равенb"\x04", то устройство хочет завершить приём данных, иb"\x04"следует записать в устройство, после чего больше код не отправлять. (Примечание: если есть байт, ожидающий чтения из устройства, то его не обязательно читать и обрабатывать немедленно — устройство продолжит потреблять входящие байты, пока оставшийся размер окна больше 0.)
Когда весь код записан в устройство, запишите
b"\x04", чтобы указать конец данных.Читайте из устройства, пока не будет получен
b"\x04". В этот момент устройство получило и скомпилировало весь отправленный код и выполняет его.Устройство выводит любые символы, производимые выполняющимся кодом. Когда (если) код завершится, будет выведен
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.