De interactieve interpretermodus van MicroPython (ook wel REPL)¶
Deze sectie behandelt enkele kenmerken van de interactieve interpretermodus van MicroPython. Een veelgebruikte term hiervoor is REPL (read-eval-print-loop), die zal worden gebruikt om naar deze interactieve prompt te verwijzen.
Notitie
OpenMV Cams stellen deze REPL beschikbaar via hun USB-seriële (CDC) poort. Dit is alleen relevant wanneer je rechtstreeks verbinding maakt met de camera via een seriële terminal-emulator (of een tool zoals MicroPython op afstand bedienen: mpremote). OpenMV IDE gebruikt de REPL niet — het communiceert met de camera via een afzonderlijk debug-protocol om scripts uit te voeren, bestanden over te dragen en de framebuffer te streamen. Alles wat op deze pagina wordt beschreven, geldt uitsluitend voor directe terminalsessies.
Automatisch inspringen¶
Wanneer je Python-statements typt die eindigen op een dubbele punt (bijvoorbeeld if, for, while), verandert de prompt in drie puntjes (…) en wordt de cursor 4 spaties ingesprongen. Wanneer je op return drukt, gaat de volgende regel verder op hetzelfde inspringniveau voor gewone statements, of op een extra inspringniveau waar dat van toepassing is. Als je op de backspace-toets drukt, wordt één inspringniveau ongedaan gemaakt.
Als je cursor helemaal terug aan het begin staat, voert het indrukken van RETURN de code uit die je hebt ingevoerd. Het volgende laat zien wat je zou zien na het invoeren van een for-statement (het onderstrepingsteken geeft aan waar de cursor uiteindelijk belandt):
>>> for i in range(30):
... _
Als je vervolgens een if-statement invoert, wordt een extra inspringniveau toegevoegd:
>>> for i in range(30):
... if i > 3:
... _
Voer nu break in gevolgd door RETURN en druk op BACKSPACE:
>>> for i in range(30):
... if i > 3:
... break
... _
Typ ten slotte print(i), druk op RETURN, druk op BACKSPACE en druk nogmaals op RETURN:
>>> for i in range(30):
... if i > 3:
... break
... print(i)
...
0
1
2
3
>>>
Automatisch inspringen wordt niet toegepast als de voorgaande twee regels enkel uit spaties bestonden. Dit betekent dat je het invoeren van een samengesteld statement kunt afronden door tweemaal op RETURN te drukken, waarna een derde druk het afrondt en uitvoert.
Automatisch aanvullen¶
Terwijl je een commando in de REPL typt, kun je, als de tot dusver getypte regel overeenkomt met het begin van de naam van iets, op TAB drukken om mogelijke invoeropties weer te geven. Importeer bijvoorbeeld eerst de machine-module door import machine in te voeren en op RETURN te drukken. Typ vervolgens m en druk op TAB; dit zou moeten uitbreiden tot machine. Voer een punt . in en druk nogmaals op TAB. Je zou zoiets als dit moeten zien:
>>> machine.
__name__ info unique_id reset
bootloader freq rng idle
sleep deepsleep disable_irq enable_irq
Pin
Het woord wordt zo veel mogelijk uitgebreid totdat er meerdere mogelijkheden bestaan. Typ bijvoorbeeld machine.Pin.PULL en druk op TAB, en het zal uitbreiden tot machine.Pin.PULL_. Een tweede druk op TAB toont de mogelijke uitbreidingen:
>>> machine.Pin.PULL_
PULL_DOWN PULL_UP
>>> machine.Pin.PULL_
Een draaiend programma onderbreken¶
Je kunt een draaiend programma onderbreken door op Ctrl-C te drukken. Dit veroorzaakt een KeyboardInterrupt die je terugbrengt naar de REPL, mits je programma de KeyboardInterrupt-uitzondering niet onderschept.
Bijvoorbeeld:
>>> 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:
>>>
Plakmodus¶
Als je wat code in je terminalvenster wilt plakken, zal de functie voor automatisch inspringen de boel in de war sturen. Als je bijvoorbeeld de volgende Python-code had:
def foo():
print('This is a test to show paste mode')
print('Here is a second line')
foo()
en je probeert dit in de normale REPL te plakken, dan zie je zoiets als dit:
>>> 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
Als je op Ctrl-E drukt, kom je in de plakmodus, die in feite de functie voor automatisch inspringen uitschakelt en de prompt verandert van >>> naar ===. Bijvoorbeeld:
>>>
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
>>>
In de plakmodus kunnen lege regels worden geplakt. De geplakte tekst wordt gecompileerd alsof het een bestand betreft. Door op Ctrl-D te drukken verlaat je de plakmodus en wordt de compilatie gestart.
Zachte reset¶
Een Zachte reset reset de Python-interpreter, maar probeert de methode waarmee je verbonden bent met de OpenMV Cam (USB) niet te resetten.
Je kunt een zachte reset uitvoeren vanuit de REPL door op Ctrl-D te drukken, of vanuit je Python-code door het volgende uit te voeren:
machine.soft_reset()
Als je bijvoorbeeld je OpenMV Cam reset en een dir()-commando uitvoert, zou je zoiets als dit zien:
>>> dir()
['__name__']
Maak nu enkele variabelen aan en herhaal het dir()-commando:
>>> i = 1
>>> j = 23
>>> x = 'abc'
>>> dir()
['j', 'x', '__name__', 'i']
>>>
Als je nu Ctrl-D invoert en het dir()-commando herhaalt, zul je zien dat je variabelen niet langer bestaan:
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__']
>>>
Zie Reset- en opstartsequentie voor meer informatie over resettypen en het opstartproces.
De speciale variabele _ (onderstrepingsteken)¶
Wanneer je de REPL gebruikt, kun je berekeningen uitvoeren en de resultaten bekijken. MicroPython slaat het resultaat van het vorige statement op in de variabele _ (onderstrepingsteken). Je kunt het onderstrepingsteken dus gebruiken om het resultaat in een variabele op te slaan. Bijvoorbeeld:
>>> 1 + 2 + 3 + 4 + 5
15
>>> x = _
>>> x
15
>>>
Raw-modus en raw-paste-modus¶
Raw-modus (ook wel raw REPL genoemd) is niet iets wat iemand normaal gesproken zou gebruiken. Het is bedoeld voor programmatisch gebruik en gedraagt zich in wezen als de plakmodus met echo uitgeschakeld en met optionele flowcontrol.
Raw-modus wordt geactiveerd met Ctrl-A. Vervolgens stuur je je Python-code, gevolgd door een Ctrl-D. De Ctrl-D wordt bevestigd met ‘OK’, waarna de Python-code wordt gecompileerd en uitgevoerd. Eventuele uitvoer (of fouten) wordt teruggestuurd. Met Ctrl-B verlaat je de raw-modus en keer je terug naar de gewone (ook wel vriendelijke) REPL.
Raw-paste-modus is een extra modus binnen de raw REPL die flowcontrol bevat en die code compileert terwijl deze wordt ontvangen. Dit maakt het robuuster voor het met hoge snelheid overbrengen van code naar het apparaat, en het gebruikt ook minder RAM tijdens het ontvangen omdat er geen letterlijke kopie van de code hoeft te worden opgeslagen voordat deze wordt gecompileerd (in tegenstelling tot de standaard raw-modus).
Raw-paste-modus gebruikt het volgende protocol:
Activeer de raw REPL zoals gebruikelijk via ctrl-A.
Schrijf 3 bytes:
b"\x05A\x01"(d.w.z. ctrl-E, dan “A”, dan ctrl-A).Lees 2 bytes om te bepalen of het apparaat in de raw-paste-modus is gegaan:
Als het resultaat
b"R\x00"is, begrijpt het apparaat het commando maar ondersteunt het geen raw paste.Als het resultaat
b"R\x01"is, ondersteunt het apparaat raw paste wel en is het in deze modus gegaan.Anders zou het resultaat
b"ra"moeten zijn en ondersteunt het apparaat geen raw paste, en moet de stringb"w REPL; CTRL-B to exit\r\n>"worden gelezen en verworpen.
Als het apparaat in de raw-paste-modus is, ga dan verder; anders val je terug op de standaard raw-modus.
Lees 2 bytes; dit is de window-size-increment voor flowcontrol (in bytes), opgeslagen als een 16-bits unsigned little-endian integer. De beginwaarde voor de variabele remaining-window-size moet op dit getal worden ingesteld.
Schrijf de code naar het apparaat:
Zolang er bytes te verzenden zijn, schrijf je tot remaining-window-size aan bytes, en verlaag je de remaining-window-size met het aantal geschreven bytes.
Als de remaining-window-size 0 is, of als er een byte klaarstaat om te lezen, lees dan 1 byte. Als deze byte
b"\x01"is, verhoog dan de remaining-window-size met de window-size-increment uit stap 5. Als deze byteb"\x04"is, dan wil het apparaat de gegevensontvangst beëindigen, en moetb"\x04"naar het apparaat worden geschreven en mag er daarna geen code meer worden verzonden. (Opmerking: als er een byte klaarstaat om van het apparaat te worden gelezen, hoeft deze niet onmiddellijk te worden gelezen en verwerkt; het apparaat blijft binnenkomende bytes verbruiken zolang remaining-window-size groter is dan 0.)
Wanneer alle code naar het apparaat is geschreven, schrijf je
b"\x04"om het einde van de gegevens aan te geven.Lees van het apparaat totdat
b"\x04"wordt ontvangen. Op dit punt heeft het apparaat alle verzonden code ontvangen en gecompileerd en voert het deze uit.Het apparaat geeft alle tekens uit die door de uitgevoerde code worden geproduceerd. Wanneer (als) de code klaar is, wordt
b"\x04"uitgevoerd, gevolgd door een eventuele niet-opgevangen uitzondering, opnieuw gevolgd doorb"\x04". Vervolgens keert het terug naar de standaard raw REPL en geeft hetb">"uit.
Als je bijvoorbeeld, beginnend bij een nieuwe regel in de normale (vriendelijke) REPL, het volgende schrijft:
b"\x01\x05A\x01print(123)\x04"
Dan zal het apparaat reageren met zoiets als:
b"\r\nraw REPL; CTRL-B to exit\r\n>R\x01\x80\x00\x01\x04123\r\n\x04\x04>"
Uitgesplitst over de tijd ziet dit er als volgt uit:
# 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>"
In dit geval is de window-size-increment voor flowcontrol 128 en zijn er aan het begin onmiddellijk twee windows aan gegevens beschikbaar: één afkomstig van de initiële window-size-increment-waarde en één van de expliciete b"\x01"-waarde die wordt verzonden. Dit betekent dus dat er om te beginnen tot 256 bytes kunnen worden geschreven voordat er moet worden gewacht of op meer binnenkomende flowcontrol-tekens moet worden gecontroleerd.
De MicroPython op afstand bedienen: mpremote-tool gebruikt de raw REPL, inclusief de raw-paste-modus, om Python-code uit te voeren op OpenMV Cams.