MicroPythonin interaktiivinen tulkkitila (eli REPL)¶
Tämä osio käsittelee MicroPythonin interaktiivisen tulkkitilan joitakin ominaisuuksia. Tästä käytetään yleisesti termiä REPL (read-eval-print-loop), jolla viitataan tähän interaktiiviseen kehotteeseen.
Muista
OpenMV Cam -kamerat tarjoavat tämän REPL:n USB-sarjaportin (CDC) kautta. Sillä on merkitystä vain, kun yhdistät kameraan suoraan sarjapääte-emulaattorilla (tai työkalulla, kuten MicroPythonin etäohjaus: mpremote). OpenMV IDE ei käytä REPL:ää — se kommunikoi kameran kanssa erillisen debug-protokollan kautta ajaakseen skriptejä, siirtääkseen tiedostoja ja striimatakseen kehyspuskuria. Kaikki tällä sivulla kuvattu koskee vain suoria päätesessioita.
Automaattinen sisennys¶
Kun kirjoitat Python-lauseita, jotka päättyvät kaksoispisteeseen (esimerkiksi if, for, while), kehote muuttuu kolmeksi pisteeksi (…) ja kursoria sisennetään 4 välilyönnillä. Kun painat rivinvaihtoa, seuraava rivi jatkuu samalla sisennystasolla tavallisten lauseiden osalta tai yhtä tasoa syvemmällä silloin kun se on tarkoituksenmukaista. Jos painat askelpalautinta, se peruuttaa yhden sisennystason.
Jos kursorisi on aivan alussa, rivinvaihdon painaminen suorittaa syöttämäsi koodin. Seuraavassa näytetään, mitä näkisit for-lauseen syöttämisen jälkeen (alaviiva näyttää, mihin kursori päätyy):
>>> for i in range(30):
... _
Jos sitten syötät if-lauseen, tarjotaan ylimääräinen sisennystaso:
>>> for i in range(30):
... if i > 3:
... _
Syötä nyt break ja sen jälkeen RETURN ja paina BACKSPACE:
>>> for i in range(30):
... if i > 3:
... break
... _
Kirjoita lopuksi print(i), paina RETURN, paina BACKSPACE ja paina RETURN uudelleen:
>>> for i in range(30):
... if i > 3:
... break
... print(i)
...
0
1
2
3
>>>
Automaattista sisennystä ei sovelleta, jos kaksi edellistä riviä koostuivat pelkistä välilyönneistä. Tämä tarkoittaa, että voit lopettaa yhdistelmälauseen syöttämisen painamalla RETURN kahdesti, ja kolmas painallus viimeistelee ja suorittaa sen.
Automaattinen täydennys¶
Kun kirjoitat komentoa REPL:ssä, jos siihen mennessä kirjoitettu rivi vastaa jonkin nimen alkua, TAB:in painaminen näyttää mahdolliset syötettävissä olevat vaihtoehdot. Tuo esimerkiksi ensin machine-moduuli syöttämällä import machine ja painamalla RETURN. Kirjoita sitten m ja paina TAB, jolloin sen pitäisi laajeta muotoon machine. Syötä piste . ja paina TAB uudelleen. Näkisit jotakin tällaista:
>>> machine.
__name__ info unique_id reset
bootloader freq rng idle
sleep deepsleep disable_irq enable_irq
Pin
Sana laajennetaan niin pitkälle kuin mahdollista, kunnes useita vaihtoehtoja on olemassa. Kirjoita esimerkiksi machine.Pin.PULL ja paina TAB, jolloin se laajenee muotoon machine.Pin.PULL_. TAB:in painaminen toisen kerran näyttää mahdolliset laajennukset:
>>> machine.Pin.PULL_
PULL_DOWN PULL_UP
>>> machine.Pin.PULL_
Käynnissä olevan ohjelman keskeyttäminen¶
Voit keskeyttää käynnissä olevan ohjelman painamalla Ctrl-C. Tämä nostaa KeyboardInterrupt-poikkeuksen, joka tuo sinut takaisin REPL:ään, edellyttäen ettei ohjelmasi sieppaa KeyboardInterrupt-poikkeusta.
Esimerkiksi:
>>> 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:
>>>
Liittämistila¶
Jos haluat liittää koodia päätemuotoon, automaattinen sisennystoiminto sekoittaa asioita. Jos sinulla olisi esimerkiksi seuraava Python-koodi:
def foo():
print('This is a test to show paste mode')
print('Here is a second line')
foo()
ja yrität liittää tämän tavalliseen REPL:ään, näkisit jotakin tällaista:
>>> 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
Jos painat Ctrl-E, siirryt liittämistilaan, joka käytännössä poistaa automaattisen sisennystoiminnon käytöstä ja muuttaa kehotteen muodosta >>> muotoon ===. Esimerkiksi:
>>>
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
>>>
Liittämistila sallii tyhjien rivien liittämisen. Liitetty teksti käännetään ikään kuin se olisi tiedosto. Ctrl-D:n painaminen poistuu liittämistilasta ja käynnistää kääntämisen.
Pehmeä uudelleenkäynnistys¶
Pehmeä nollaus nollaa Python-tulkin, mutta yrittää olla nollaamatta tapaa, jolla olet yhteydessä OpenMV Cam -kameraan (USB).
Voit suorittaa pehmeän uudelleenkäynnistyksen REPL:stä painamalla Ctrl-D, tai Python-koodistasi suorittamalla:
machine.soft_reset()
Jos esimerkiksi nollaat OpenMV Cam -kamerasi ja suoritat dir()-komennon, näkisit jotakin tällaista:
>>> dir()
['__name__']
Luo nyt joitakin muuttujia ja toista dir()-komento:
>>> i = 1
>>> j = 23
>>> x = 'abc'
>>> dir()
['j', 'x', '__name__', 'i']
>>>
Jos nyt syötät Ctrl-D ja toistat dir()-komennon, huomaat, että muuttujasi eivät enää ole olemassa:
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__']
>>>
Lisätietoja uudelleenkäynnistystyypeistä ja käynnistysprosessista on kohdassa Nollaus- ja käynnistyssekvenssi.
Erityismuuttuja _ (alaviiva)¶
Kun käytät REPL:ää, voit suorittaa laskutoimituksia ja nähdä tulokset. MicroPython tallentaa edellisen lauseen tuloksen muuttujaan _ (alaviiva). Voit siis käyttää alaviivaa tuloksen tallentamiseen muuttujaan. Esimerkiksi:
>>> 1 + 2 + 3 + 4 + 5
15
>>> x = _
>>> x
15
>>>
Raakatila ja raaka-liittämistila¶
Raakatila (kutsutaan myös raaka-REPL:ksi) ei ole sellainen, jota ihminen yleensä käyttäisi. Se on tarkoitettu ohjelmalliseen käyttöön ja toimii käytännössä kuten liittämistila, jossa kaiku on poistettu käytöstä ja jossa on valinnainen vuonohjaus.
Raakatilaan siirrytään käyttämällä Ctrl-A:ta. Sen jälkeen lähetät Python-koodisi ja sen perään Ctrl-D:n. Ctrl-D kuitataan ’OK’-viestillä, minkä jälkeen Python-koodi käännetään ja suoritetaan. Mahdollinen tuloste (tai virheet) lähetetään takaisin. Ctrl-B:n syöttäminen poistuu raakatilasta ja palauttaa tavalliseen (eli ystävälliseen) REPL:ään.
Raaka-liittämistila on lisätila raaka-REPL:n sisällä, joka sisältää vuonohjauksen ja joka kääntää koodia samalla kun vastaanottaa sitä. Tämä tekee siitä vakaamman koodin nopeaan siirtoon laitteeseen, ja se käyttää myös vähemmän RAM-muistia vastaanotossa, koska sen ei tarvitse tallentaa koodista sananmukaista kopiota ennen kääntämistä (toisin kuin tavallisessa raakatilassa).
Raaka-liittämistila käyttää seuraavaa protokollaa:
Siirry raaka-REPL:ään tavalliseen tapaan ctrl-A:lla.
Kirjoita 3 tavua:
b"\x05A\x01"(eli ctrl-E, sitten ”A”, sitten ctrl-A).Lue 2 tavua sen määrittämiseksi, siirtyikö laite raaka-liittämistilaan:
Jos tulos on
b"R\x00", laite ymmärtää komennon mutta ei tue raaka-liittämistä.Jos tulos on
b"R\x01", laite tukee raaka-liittämistä ja on siirtynyt tähän tilaan.Muussa tapauksessa tuloksen pitäisi olla
b"ra"ja laite ei tue raaka-liittämistä, ja merkkijonob"w REPL; CTRL-B to exit\r\n>"tulisi lukea ja hylätä.
Jos laite on raaka-liittämistilassa, jatka, muussa tapauksessa palaa tavalliseen raakatilaan.
Lue 2 tavua, tämä on vuonohjauksen ikkunakoon kasvatus (tavuina) tallennettuna 16-bittisenä etumerkittömänä little endian -kokonaislukuna. Jäljellä olevan ikkunakoon muuttujan alkuarvo tulisi asettaa tähän lukuun.
Kirjoita koodi laitteeseen:
Niin kauan kuin lähetettäviä tavuja on, kirjoita enintään jäljellä olevan ikkunakoon verran tavuja ja pienennä jäljellä olevaa ikkunakokoa kirjoitettujen tavujen määrällä.
Jos jäljellä oleva ikkunakoko on 0 tai luettavissa on tavu odottamassa, lue 1 tavu. Jos tämä tavu on
b"\x01", kasvata jäljellä olevaa ikkunakokoa vaiheen 5 ikkunakoon kasvatuksella. Jos tämä tavu onb"\x04", laite haluaa lopettaa datan vastaanoton, ja laitteeseen tulisi kirjoittaab"\x04"eikä sen jälkeen lähettää enempää koodia. (Huom: jos laitteesta on tavu odottamassa lukemista, sitä ei tarvitse lukea ja käsitellä välittömästi, laite jatkaa saapuvien tavujen kuluttamista niin kauan kuin jäljellä oleva ikkunakoko on suurempi kuin 0.)
Kun kaikki koodi on kirjoitettu laitteeseen, kirjoita
b"\x04"osoittamaan datan loppumista.Lue laitteesta, kunnes
b"\x04"vastaanotetaan. Tässä vaiheessa laite on vastaanottanut ja kääntänyt kaiken lähetetyn koodin ja suorittaa sitä.Laite tulostaa kaikki suoritettavan koodin tuottamat merkit. Kun (jos) koodi päättyy, tulostetaan
b"\x04", jota seuraa mahdollinen käsittelemätön poikkeus, jota seuraa jälleenb"\x04". Sen jälkeen se palaa tavalliseen raaka-REPL:ään ja tulostaab">".
Esimerkiksi, alkaen uudelta riviltä tavallisessa (ystävällisessä) REPL:ssä, jos kirjoitat:
b"\x01\x05A\x01print(123)\x04"
Tällöin laite vastaa jotenkin näin:
b"\r\nraw REPL; CTRL-B to exit\r\n>R\x01\x80\x00\x01\x04123\r\n\x04\x04>"
Ajan kuluessa eriteltynä tämä näyttää tältä:
# 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>"
Tässä tapauksessa vuonohjauksen ikkunakoon kasvatus on 128, ja alussa on heti saatavilla kahden ikkunan verran dataa, toinen alkuperäisestä ikkunakoon kasvatusarvosta ja toinen nimenomaisesti lähetettävästä b"\x01"-arvosta. Tämä tarkoittaa siis, että alussa voidaan kirjoittaa enintään 256 tavua ennen kuin odotetaan tai tarkistetaan lisää saapuvia vuonohjausmerkkejä.
MicroPythonin etäohjaus: mpremote-työkalu käyttää raaka-REPL:ää, mukaan lukien raaka-liittämistilaa, suorittaakseen Python-koodia OpenMV Cam -kameroissa.