Interaktivní režim interpreteru MicroPython (známý jako REPL)¶
Tato část popisuje některé vlastnosti interaktivního režimu interpreteru MicroPython. Běžně používaným termínem pro tento režim je REPL (read-eval-print-loop), který budeme používat pro označení tohoto interaktivního příkazového řádku.
Poznámka
Kamery OpenMV Cam zpřístupňují tento REPL přes svůj USB sériový (CDC) port. To je relevantní pouze tehdy, když se ke kameře připojujete přímo pomocí emulátoru sériového terminálu (nebo nástroje, jako je Vzdálené ovládání MicroPythonu: mpremote). OpenMV IDE REPL nepoužívá — komunikuje s kamerou přes samostatný ladicí protokol, aby spouštělo skripty, přenášelo soubory a streamovalo snímkový buffer (frame buffer). Vše popsané na této stránce se týká pouze přímých relací v terminálu.
Automatické odsazování¶
Při psaní příkazů jazyka Python, které končí dvojtečkou (například if, for, while), se příkazový řádek změní na tři tečky (…) a kurzor bude odsazen o 4 mezery. Když stisknete Enter, další řádek bude pokračovat na stejné úrovni odsazení u běžných příkazů nebo na další úrovni odsazení, kde je to vhodné. Pokud stisknete klávesu Backspace, zruší se jedna úroveň odsazení.
Pokud je váš kurzor zcela na začátku, stisknutím klávesy RETURN se spustí kód, který jste zadali. Následující ukázka ukazuje, co byste viděli po zadání příkazu for (podtržítko ukazuje, kde se kurzor nakonec ocitne):
>>> for i in range(30):
... _
Pokud poté zadáte příkaz if, poskytne se další úroveň odsazení:
>>> for i in range(30):
... if i > 3:
... _
Nyní zadejte break, poté stiskněte RETURN a stiskněte BACKSPACE:
>>> for i in range(30):
... if i > 3:
... break
... _
Nakonec napište print(i), stiskněte RETURN, stiskněte BACKSPACE a znovu stiskněte RETURN:
>>> for i in range(30):
... if i > 3:
... break
... print(i)
...
0
1
2
3
>>>
Automatické odsazování se neaplikuje, pokud byly předchozí dva řádky tvořeny pouze mezerami. To znamená, že zadávání složeného příkazu můžete ukončit dvojím stisknutím klávesy RETURN a třetím stisknutím jej dokončíte a spustíte.
Automatické dokončování¶
Při psaní příkazu v REPL, pokud dosud napsaný řádek odpovídá začátku názvu něčeho, pak stisknutím klávesy TAB se zobrazí možné věci, které lze zadat. Například nejprve naimportujte modul machine zadáním import machine a stisknutím klávesy RETURN. Poté napište m a stiskněte TAB, čímž by se mělo rozšířit na machine. Zadejte tečku . a znovu stiskněte TAB. Měli byste vidět něco jako:
>>> machine.
__name__ info unique_id reset
bootloader freq rng idle
sleep deepsleep disable_irq enable_irq
Pin
Slovo bude rozšířeno co nejvíce, dokud nebude existovat více možností. Například napište machine.Pin.PULL a stiskněte TAB, čímž se rozšíří na machine.Pin.PULL_. Druhým stisknutím klávesy TAB se zobrazí možná rozšíření:
>>> machine.Pin.PULL_
PULL_DOWN PULL_UP
>>> machine.Pin.PULL_
Přerušení běžícího programu¶
Běžící program můžete přerušit stisknutím kláves Ctrl-C. Tím se vyvolá výjimka KeyboardInterrupt, která vás vrátí zpět do REPL, za předpokladu, že váš program výjimku KeyboardInterrupt nezachytává.
Například:
>>> 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:
>>>
Režim vkládání (Paste mode)¶
Pokud chcete vložit nějaký kód do okna terminálu, funkce automatického odsazování věci pokazí. Například pokud byste měli následující kód jazyka Python:
def foo():
print('This is a test to show paste mode')
print('Here is a second line')
foo()
a pokusíte se jej vložit do běžného REPL, uvidíte něco takového:
>>> 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
Pokud stisknete Ctrl-E, vstoupíte do režimu vkládání, který v podstatě vypne funkci automatického odsazování a změní příkazový řádek z >>> na ===. Například:
>>>
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
>>>
Režim vkládání umožňuje vkládání prázdných řádků. Vložený text se kompiluje, jako by se jednalo o soubor. Stisknutím Ctrl-D opustíte režim vkládání a zahájíte kompilaci.
Softwarový reset¶
Měkký reset resetuje interpreter Pythonu, ale snaží se neresetovat způsob, kterým jste připojeni ke kameře OpenMV Cam (USB).
Softwarový reset můžete provést z REPL stisknutím Ctrl-D nebo z vašeho kódu jazyka Python spuštěním:
machine.soft_reset()
Například pokud resetujete svou kameru OpenMV Cam a spustíte příkaz dir(), uvidíte něco takového:
>>> dir()
['__name__']
Nyní vytvořte několik proměnných a zopakujte příkaz dir():
>>> i = 1
>>> j = 23
>>> x = 'abc'
>>> dir()
['j', 'x', '__name__', 'i']
>>>
Nyní pokud stisknete Ctrl-D a zopakujete příkaz dir(), uvidíte, že vaše proměnné již neexistují:
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__']
>>>
Více informací o typech resetu a procesu spouštění naleznete v Sekvence resetu a spuštění.
Speciální proměnná _ (podtržítko)¶
Když používáte REPL, můžete provádět výpočty a vidět výsledky. MicroPython ukládá výsledek předchozího příkazu do proměnné _ (podtržítko). Podtržítko tedy můžete použít k uložení výsledku do proměnné. Například:
>>> 1 + 2 + 3 + 4 + 5
15
>>> x = _
>>> x
15
>>>
Surový režim (raw mode) a surový režim vkládání (raw-paste mode)¶
Surový režim (nazývaný také surový REPL) není něco, co by běžně používal člověk. Je určen pro programové použití a v podstatě se chová jako režim vkládání s vypnutým echem a s volitelným řízením toku.
Do surového režimu se vstupuje pomocí Ctrl-A. Poté odešlete svůj kód jazyka Python, následovaný Ctrl-D. Ctrl-D bude potvrzeno textem ‚OK‘ a poté bude kód jazyka Python zkompilován a spuštěn. Jakýkoli výstup (nebo chyby) bude odeslán zpět. Zadáním Ctrl-B opustíte surový režim a vrátíte se do běžného (známého jako přátelského) REPL.
Surový režim vkládání je dodatečný režim v rámci surového REPL, který zahrnuje řízení toku a který kompiluje kód, jak jej přijímá. To jej činí robustnějším pro vysokorychlostní přenos kódu do zařízení a také používá méně paměti RAM při příjmu, protože nemusí ukládat doslovnou kopii kódu před kompilací (na rozdíl od standardního surového režimu).
Surový režim vkládání používá následující protokol:
Vstupte do surového REPL obvyklým způsobem pomocí ctrl-A.
Zapište 3 bajty:
b"\x05A\x01"(tj. ctrl-E, poté „A“ a poté ctrl-A).Přečtěte 2 bajty, abyste zjistili, zda zařízení vstoupilo do surového režimu vkládání:
Pokud je výsledkem
b"R\x00", pak zařízení příkazu rozumí, ale nepodporuje surové vkládání.Pokud je výsledkem
b"R\x01", pak zařízení surové vkládání podporuje a vstoupilo do tohoto režimu.Jinak by výsledkem měl být
b"ra", zařízení surové vkládání nepodporuje a měl by se přečíst a zahodit řetězecb"w REPL; CTRL-B to exit\r\n>".
Pokud je zařízení v surovém režimu vkládání, pokračujte, jinak se vraťte ke standardnímu surovému režimu.
Přečtěte 2 bajty, což je přírůstek velikosti okna řízení toku (v bajtech) uložený jako 16bitové unsigned little endian celé číslo. Počáteční hodnota proměnné zbývající-velikost-okna by měla být nastavena na toto číslo.
Zapište kód do zařízení:
Dokud jsou k odeslání bajty, zapisujte až tolik bajtů, kolik činí zbývající-velikost-okna, a snižte zbývající-velikost-okna o počet zapsaných bajtů.
Pokud je zbývající-velikost-okna 0 nebo čeká bajt ke čtení, přečtěte 1 bajt. Pokud je tímto bajtem
b"\x01", zvyšte zbývající-velikost-okna o přírůstek velikosti okna z kroku 5. Pokud je tímto bajtemb"\x04", pak zařízení chce ukončit příjem dat a do zařízení by měl být zapsánb"\x04"a poté by již neměl být odesílán žádný další kód. (Poznámka: pokud čeká bajt ke čtení ze zařízení, nemusí být přečten a zpracován okamžitě, zařízení bude pokračovat ve spotřebovávání příchozích bajtů, dokud je zbývající-velikost-okna větší než 0.)
Když je veškerý kód zapsán do zařízení, zapište
b"\x04"pro označení konce dat.Čtěte ze zařízení, dokud není přijat
b"\x04". V tomto okamžiku zařízení přijalo a zkompilovalo veškerý odeslaný kód a spouští jej.Zařízení vypisuje veškeré znaky vytvořené spouštěným kódem. Když (pokud) kód skončí, bude vypsán
b"\x04", následovaný jakoukoli nezachycenou výjimkou a poté znovub"\x04". Poté se vrátí do standardního surového REPL a vypíšeb">".
Například, počínaje na novém řádku v běžném (přátelském) REPL, pokud zapíšete:
b"\x01\x05A\x01print(123)\x04"
Pak zařízení odpoví něčím jako:
b"\r\nraw REPL; CTRL-B to exit\r\n>R\x01\x80\x00\x01\x04123\r\n\x04\x04>"
Rozloženo v čase to vypadá takto:
# 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>"
V tomto případě je přírůstek velikosti okna řízení toku 128 a na začátku jsou okamžitě dostupná data o velikosti dvou oken, jedno z počáteční hodnoty přírůstku velikosti okna a jedno z explicitní hodnoty b"\x01", která je odeslána. To tedy znamená, že na začátku lze zapsat až 256 bajtů, než je třeba čekat nebo kontrolovat další příchozí znaky řízení toku.
Nástroj Vzdálené ovládání MicroPythonu: mpremote používá surový REPL, včetně surového režimu vkládání, ke spouštění kódu jazyka Python na kamerách OpenMV Cam.