Interaktivni način rada interpretera MicroPython (poznat i kao REPL)

Ovaj odjeljak obrađuje neke značajke interaktivnog načina rada interpretera MicroPython. Često korišten naziv za to je REPL (read-eval-print-loop), koji ćemo koristiti za označavanje ovog interaktivnog upita.

Napomena

OpenMV Cam kamere izlažu ovaj REPL preko svojeg USB serijskog (CDC) priključka. Relevantan je samo kada se s kamerom povezujete izravno pomoću serijskog terminalskog emulatora (ili alata poput Daljinsko upravljanje MicroPythonom: mpremote). OpenMV IDE ne koristi REPL — s kamerom komunicira putem zasebnog protokola za otklanjanje pogrešaka radi pokretanja skripti, prijenosa datoteka i strujanja međuspremnika slike. Sve opisano na ovoj stranici odnosi se isključivo na izravne terminalske sesije.

Automatsko uvlačenje

Kada upisujete Python naredbe koje završavaju dvotočkom (na primjer if, for, while), upit će se promijeniti u tri točke (…), a kursor će biti uvučen za 4 razmaka. Kada pritisnete return, sljedeći redak nastavit će se na istoj razini uvlačenja za uobičajene naredbe ili na dodatnoj razini uvlačenja gdje je to prikladno. Ako pritisnete tipku backspace, poništit će se jedna razina uvlačenja.

Ako se kursor nalazi sasvim na početku, pritiskom na RETURN izvršit će se kôd koji ste unijeli. Sljedeće prikazuje što biste vidjeli nakon unosa for naredbe (podvlaka pokazuje gdje kursor završava):

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

Ako zatim unesete if naredbu, dodat će se još jedna razina uvlačenja:

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

Sada unesite break praćeno tipkom RETURN i pritisnite BACKSPACE:

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

Naposljetku upišite print(i), pritisnite RETURN, pritisnite BACKSPACE i ponovno pritisnite RETURN:

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

Automatsko uvlačenje neće se primijeniti ako su prethodna dva retka bila sastavljena samo od razmaka. To znači da unos složene naredbe možete dovršiti dvostrukim pritiskom na RETURN, a treći pritisak će je dovršiti i izvršiti.

Automatsko dovršavanje

Tijekom upisivanja naredbe u REPL-u, ako dosad upisani redak odgovara početku imena nečega, pritiskom na TAB prikazat će se moguće stvari koje bi se mogle unijeti. Na primjer, najprije uvezite modul machine upisivanjem import machine i pritiskom na RETURN. Zatim upišite m i pritisnite TAB te bi se trebalo proširiti u machine. Unesite točku . i ponovno pritisnite TAB. Trebali biste vidjeti nešto poput:

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

Riječ će se proširiti koliko god je moguće dok ne postoji više mogućnosti. Na primjer, upišite machine.Pin.PULL i pritisnite TAB te će se proširiti u machine.Pin.PULL_. Drugim pritiskom na TAB prikazat će se moguća proširenja:

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

Prekidanje programa koji se izvodi

Program koji se izvodi možete prekinuti pritiskom na Ctrl-C. Time će se podignuti KeyboardInterrupt koji će vas vratiti u REPL, pod uvjetom da vaš program ne presreće iznimku KeyboardInterrupt.

Na primjer:

>>> 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:
>>>

Način lijepljenja

Ako želite zalijepiti nešto koda u prozor terminala, značajka automatskog uvlačenja sve će pokvariti. Na primjer, ako imate sljedeći Python kôd:

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

i pokušate ga zalijepiti u uobičajeni REPL, vidjet ćete nešto poput ovoga:

>>> 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

Ako pritisnete Ctrl-E, ući ćete u način lijepljenja, koji u biti isključuje značajku automatskog uvlačenja i mijenja upit iz >>> u ===. Na primjer:

>>>
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
>>>

Način lijepljenja dopušta lijepljenje praznih redaka. Zalijepljeni tekst kompilira se kao da je datoteka. Pritiskom na Ctrl-D izlazi se iz načina lijepljenja i pokreće kompilacija.

Meki reset

Operacija Meko resetiranje resetirat će Python interpreter, ali pokušava ne resetirati način na koji ste povezani s OpenMV Cam kamerom (USB).

Meki reset možete izvršiti iz REPL-a pritiskom na Ctrl-D ili iz svog Python koda izvršavanjem:

machine.soft_reset()

Na primjer, ako resetirate svoju OpenMV Cam kameru i izvršite naredbu dir(), vidjeli biste nešto poput ovoga:

>>> dir()
['__name__']

Sada stvorite nekoliko varijabli i ponovite naredbu dir():

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

Sada ako unesete Ctrl-D i ponovite naredbu dir(), vidjet ćete da vaše varijable više ne postoje:

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__']
>>>

Za više informacija o vrstama resetiranja i postupku pokretanja pogledajte Slijed resetiranja i pokretanja.

Posebna varijabla _ (podvlaka)

Kada koristite REPL, možete izvoditi izračune i vidjeti rezultate. MicroPython pohranjuje rezultat prethodne naredbe u varijablu _ (podvlaka). Tako podvlaku možete koristiti za spremanje rezultata u varijablu. Na primjer:

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

Sirovi način i sirovi način lijepljenja

Sirovi način (poznat i kao sirovi REPL) nije nešto što bi osoba uobičajeno koristila. Namijenjen je programskoj uporabi i u biti se ponaša poput načina lijepljenja s isključenim odjekom (echo) te s opcionalnom kontrolom toka.

U sirovi način ulazi se pomoću Ctrl-A. Zatim šaljete svoj Python kôd, praćen s Ctrl-D. Ctrl-D bit će potvrđen s ‘OK’, a zatim će Python kôd biti kompiliran i izvršen. Svaki izlaz (ili pogreške) bit će poslan natrag. Unosom Ctrl-B napustit ćete sirovi način i vratiti se u uobičajeni (poznat i kao prijateljski) REPL.

Sirovi način lijepljenja dodatni je način unutar sirovog REPL-a koji uključuje kontrolu toka i koji kompilira kôd dok ga prima. To ga čini robusnijim za brzi prijenos koda u uređaj, a također koristi manje RAM-a pri primanju jer ne mora pohranjivati doslovnu kopiju koda prije kompiliranja (za razliku od standardnog sirovog načina).

Sirovi način lijepljenja koristi sljedeći protokol:

  1. Uđite u sirovi REPL na uobičajeni način putem ctrl-A.

  2. Zapišite 3 bajta: b"\x05A\x01" (tj. ctrl-E zatim „A” zatim ctrl-A).

  3. Pročitajte 2 bajta kako biste utvrdili je li uređaj ušao u sirovi način lijepljenja:

    • Ako je rezultat b"R\x00" tada uređaj razumije naredbu, ali ne podržava sirovo lijepljenje.

    • Ako je rezultat b"R\x01" tada uređaj podržava sirovo lijepljenje i ušao je u ovaj način.

    • U suprotnom bi rezultat trebao biti b"ra" te uređaj ne podržava sirovo lijepljenje i niz b"w REPL; CTRL-B to exit\r\n>" treba pročitati i odbaciti.

  4. Ako je uređaj u sirovom načinu lijepljenja, nastavite, u suprotnom se vratite na standardni sirovi način.

  5. Pročitajte 2 bajta, to je prirast veličine prozora kontrole toka (u bajtovima) pohranjen kao 16-bitni cijeli broj bez predznaka u little endian poretku. Početna vrijednost varijable preostale veličine prozora treba se postaviti na ovaj broj.

  6. Zapišite kôd u uređaj:

    • Dok postoje bajtovi za slanje, zapišite do preostale veličine prozora vrijednih bajtova i smanjite preostalu veličinu prozora za broj zapisanih bajtova.

    • Ako je preostala veličina prozora 0 ili postoji bajt koji čeka na čitanje, pročitajte 1 bajt. Ako je taj bajt b"\x01" tada povećajte preostalu veličinu prozora za prirast veličine prozora iz koraka 5. Ako je taj bajt b"\x04" tada uređaj želi prekinuti primanje podataka i b"\x04" treba zapisati u uređaj te se nakon toga više ne šalje kôd. (Napomena: ako postoji bajt koji čeka na čitanje s uređaja, ne treba ga odmah pročitati i reagirati na njega; uređaj će nastaviti trošiti dolazne bajtove sve dok je preostala veličina prozora veća od 0.)

  7. Kada je sav kôd zapisan u uređaj, zapišite b"\x04" kako biste označili kraj podataka.

  8. Čitajte s uređaja dok se ne primi b"\x04". U tom je trenutku uređaj primio i kompilirao sav poslani kôd te ga izvršava.

  9. Uređaj ispisuje sve znakove koje proizvede kôd koji se izvršava. Kada (ako) kôd završi, ispisat će se b"\x04", praćeno svakom neuhvaćenom iznimkom, te ponovno b"\x04". Zatim se vraća na standardni sirovi REPL i ispisuje b">".

Na primjer, počevši od novog retka u uobičajenom (prijateljskom) REPL-u, ako zapišete:

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

Tada će uređaj odgovoriti nečim poput:

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

Rastavljeno kroz vrijeme to izgleda ovako:

# 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>"

U ovom slučaju prirast veličine prozora kontrole toka iznosi 128 i na početku su odmah dostupna dva prozora vrijedna podataka, jedan od početne vrijednosti prirasta veličine prozora i jedan od eksplicitne vrijednosti b"\x01" koja se šalje. To znači da se na početku može zapisati do 256 bajtova prije čekanja ili provjeravanja daljnjih dolaznih znakova kontrole toka.

Alat Daljinsko upravljanje MicroPythonom: mpremote koristi sirovi REPL, uključujući sirovi način lijepljenja, za izvršavanje Python koda na OpenMV Cam kamerama.