Інтерактивний режим інтерпретатора MicroPython (REPL)¶
Цей розділ охоплює деякі характеристики інтерактивного режиму інтерпретатора MicroPython. Загальноприйнятий термін для нього — REPL (read-eval-print-loop, цикл «читання-обчислення-виведення»), і саме це позначення використовуватиметься для опису інтерактивного рядка запиту.
Примітка
OpenMV Cam надають доступ до REPL через послідовний порт USB (CDC). Це актуально лише тоді, коли ви підключаєтеся до камери безпосередньо за допомогою термінального емулятора (або такого інструменту, як Дистанційне керування MicroPython: mpremote). OpenMV IDE не використовує REPL — він взаємодіє з камерою через окремий протокол налагодження для запуску скриптів, передачі файлів та трансляції кадрового буфера. Усе, описане на цій сторінці, стосується лише прямих сесій у терміналі.
Автовідступ¶
Під час введення операторів Python, що завершуються двокрапкою (наприклад if, for, while), рядок запиту зміниться на три крапки (…), а курсор буде зсунуто на 4 пробіли. При натисканні RETURN наступний рядок продовжуватиметься на тому ж рівні відступу для звичайних операторів або з додатковим рівнем там, де це доречно. При натисканні 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
>>>
Режим raw та режим raw-paste¶
Режим raw (також відомий як raw REPL) не призначений для звичайного використання людьми. Він призначений для програмного застосування і за поведінкою нагадує режим вставки з вимкненим відлунням і необов’язковим керуванням потоком.
Режим raw активується за допомогою Ctrl-A. Потім ви надсилаєте свій Python-код, після чого — Ctrl-D. Отримання Ctrl-D підтверджується відповіддю „OK“, після чого Python-код компілюється і виконується. Будь-який вивід (або помилки) надсилається назад. Натискання Ctrl-B виходить з режиму raw і повертає до звичайного (дружнього) REPL.
Режим raw-paste — це додатковий режим у raw REPL, що включає керування потоком і компілює код у міру його отримання. Це робить його більш надійним для швидкої передачі коду на пристрій, а також використовує менше RAM під час отримання, оскільки не потребує зберігання точної копії коду перед компіляцією (на відміну від стандартного режиму raw).
Режим raw-paste використовує такий протокол:
Увійдіть у raw REPL звичайним способом через ctrl-A.
Запишіть 3 байти:
b"\x05A\x01"(тобто ctrl-E, потім «A», потім ctrl-A).Прочитайте 2 байти, щоб визначити, чи перейшов пристрій у режим raw-paste:
Якщо результат —
b"R\x00", пристрій розуміє команду, але не підтримує raw-paste.Якщо результат —
b"R\x01", пристрій підтримує raw-paste і перейшов у цей режим.В іншому випадку результат має бути
b"ra", і пристрій не підтримує raw-paste; слід прочитати й відкинути рядокb"w REPL; CTRL-B to exit\r\n>".
Якщо пристрій перебуває в режимі raw-paste, продовжуйте, інакше поверніться до стандартного режиму raw.
Прочитайте 2 байти — це приріст розміру вікна керування потоком (у байтах), збережений як 16-бітне беззнакове ціле число з порядком байтів little-endian. Початкове значення змінної remaining-window-size слід встановити рівним цьому числу.
Запишіть код на пристрій:
Поки є байти для відправки, записуйте кількість байтів, що не перевищує поточний розмір вікна (remaining-window-size), і зменшуйте remaining-window-size на кількість записаних байтів.
Якщо remaining-window-size дорівнює 0 або є байт, що очікує на читання, прочитайте 1 байт. Якщо цей байт —
b"\x01", збільшіть remaining-window-size на значення приросту вікна з кроку 5. Якщо цей байт —b"\x04", пристрій хоче завершити приймання даних; слід записатиb"\x04"на пристрій і більше не надсилати код. (Примітка: якщо є байт, що очікує на читання з пристрою, його не потрібно негайно читати й обробляти — пристрій продовжуватиме споживати вхідні байти, доки remaining-window-size більше 0.)
Коли весь код записано на пристрій, запишіть
b"\x04"для позначення кінця даних.Читайте з пристрою, поки не отримаєте
b"\x04". У цей момент пристрій отримав і скомпілював весь надісланий код та виконує його.Пристрій виводить усі символи, що генерує код, який виконується. Коли (якщо) код завершується, буде виведено
b"\x04", потім будь-яке неперехоплене виключення, а потім зновуb"\x04". Після цього пристрій повертається до стандартного raw 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 використовує raw REPL, включаючи режим raw-paste, для виконання Python-коду на OpenMV Cam.