MicroPython Etkileşimli Yorumlayıcı Modu (diğer adıyla REPL)

Bu bölüm, MicroPython Etkileşimli Yorumlayıcı Modu’nun bazı özelliklerini ele alır. Bunun için yaygın olarak kullanılan bir terim REPL’dir (read-eval-print-loop, oku-değerlendir-yazdır-döngüsü) ve bu etkileşimli istem buradan itibaren bu terimle anılacaktır.

Not

OpenMV Cam’ler bu REPL’i USB seri (CDC) portları üzerinden sunar. Bu yalnızca kameraya doğrudan bir seri terminal emülatörü (veya MicroPython uzaktan kontrol: mpremote gibi bir araç) ile bağlandığınızda geçerlidir. OpenMV IDE REPL’i kullanmaz — betikleri çalıştırmak, dosya aktarmak ve çerçeve arabelleğini (frame buffer) akıtmak için kamerayla ayrı bir hata ayıklama protokolü üzerinden iletişim kurar. Bu sayfada anlatılan her şey yalnızca doğrudan terminal oturumları için geçerlidir.

Otomatik girintileme

İki nokta üst üste ile biten Python ifadeleri yazdığınızda (örneğin if, for, while) istem üç noktaya (…) değişir ve imleç 4 boşluk girintilenir. Return tuşuna bastığınızda, sonraki satır normal ifadeler için aynı girinti düzeyinde devam eder veya uygun olduğunda bir düzey daha girintilenir. Geri silme (backspace) tuşuna basarsanız bir girinti düzeyini geri alır.

İmleciniz tamamen başa dönmüşse, RETURN tuşuna basmak girdiğiniz kodu çalıştırır. Aşağıda, bir for ifadesi girdikten sonra göreceğiniz şey gösterilmektedir (alt çizgi, imlecin nerede sonlandığını gösterir):

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

Ardından bir if ifadesi girerseniz, ek bir girinti düzeyi sağlanır:

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

Şimdi break yazıp RETURN tuşuna basın ve ardından BACKSPACE tuşuna basın:

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

Son olarak print(i) yazın, RETURN tuşuna basın, BACKSPACE tuşuna basın ve tekrar RETURN tuşuna basın:

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

Önceki iki satırın tamamı boşluklardan oluşuyorsa otomatik girintileme uygulanmaz. Bu, bir bileşik ifadenin girilmesini RETURN tuşuna iki kez basarak bitirebileceğiniz, üçüncü basışın ise işlemi bitirip çalıştıracağı anlamına gelir.

Otomatik tamamlama

REPL’de bir komut yazarken, o ana kadar yazılan satır bir şeyin adının başlangıcına karşılık geliyorsa, TAB tuşuna basmak girilebilecek olası şeyleri gösterir. Örneğin, önce import machine yazıp RETURN tuşuna basarak machine modülünü içe aktarın. Ardından m yazıp TAB tuşuna basın; bunun machine olarak genişlemesi gerekir. Bir nokta . girip tekrar TAB tuşuna basın. Aşağıdakine benzer bir şey görmelisiniz:

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

Kelime, birden fazla olasılık ortaya çıkana kadar mümkün olduğunca genişletilir. Örneğin, machine.Pin.PULL yazıp TAB tuşuna basarsanız machine.Pin.PULL_ olarak genişler. TAB tuşuna ikinci kez basmak olası genişlemeleri gösterir:

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

Çalışan bir programı kesme

Çalışan bir programı Ctrl-C tuşlarına basarak kesebilirsiniz. Bu, programınız KeyboardInterrupt istisnasını yakalamadığı sürece sizi REPL’e geri getiren bir KeyboardInterrupt oluşturur.

Örneğin:

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

Yapıştırma modu

Terminal pencerenize bir miktar kod yapıştırmak isterseniz, otomatik girintileme özelliği işleri karıştırır. Örneğin, aşağıdaki Python koduna sahip olsaydınız:

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

ve bunu normal REPL’e yapıştırmaya çalışırsanız, aşağıdakine benzer bir şey görürsünüz:

>>> 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 tuşlarına basarsanız, esasen otomatik girintileme özelliğini kapatan ve istemi >>> yerine === olarak değiştiren yapıştırma moduna girersiniz. Örneğin:

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

Yapıştırma Modu, boş satırların yapıştırılmasına izin verir. Yapıştırılan metin, bir dosyaymış gibi derlenir. Ctrl-D tuşlarına basmak yapıştırma modundan çıkar ve derlemeyi başlatır.

Yazılımsal sıfırlama

Bir Yazılımsal Sıfırlama, Python yorumlayıcısını sıfırlar, ancak OpenMV Cam’e bağlanma yönteminizi (USB) sıfırlamamaya çalışır.

Yazılımsal sıfırlamayı REPL’den Ctrl-D tuşlarına basarak veya Python kodunuzdan şunu çalıştırarak gerçekleştirebilirsiniz:

machine.soft_reset()

Örneğin, OpenMV Cam’inizi sıfırlayıp bir dir() komutu çalıştırırsanız, aşağıdakine benzer bir şey görürsünüz:

>>> dir()
['__name__']

Şimdi birkaç değişken oluşturun ve dir() komutunu tekrarlayın:

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

Şimdi Ctrl-D girip dir() komutunu tekrarlarsanız, değişkenlerinizin artık var olmadığını görürsünüz:

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

Sıfırlama türleri ve başlatma süreci hakkında daha fazla bilgi için bkz. Sıfırlama ve Önyükleme Dizisi.

Özel değişken _ (alt çizgi)

REPL’i kullanırken hesaplamalar yapabilir ve sonuçları görebilirsiniz. MicroPython, önceki ifadenin sonucunu _ (alt çizgi) değişkeninde saklar. Böylece sonucu bir değişkene kaydetmek için alt çizgiyi kullanabilirsiniz. Örneğin:

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

Ham mod ve ham yapıştırma modu

Ham mod (ham REPL olarak da adlandırılır), bir kişinin normalde kullanacağı bir şey değildir. Programlı kullanım için tasarlanmıştır ve esasen yankı (echo) kapalı olarak ve isteğe bağlı akış denetimiyle birlikte yapıştırma modu gibi davranır.

Ham moda Ctrl-A ile girilir. Ardından python kodunuzu gönderir, arkasından bir Ctrl-D gönderirsiniz. Ctrl-D, ‘OK’ ile onaylanır ve ardından python kodu derlenip çalıştırılır. Herhangi bir çıktı (veya hatalar) geri gönderilir. Ctrl-B girmek ham moddan çıkar ve normal (diğer adıyla dostça) REPL’e döner.

Ham yapıştırma modu, akış denetimi içeren ve kodu aldıkça derleyen, ham REPL içindeki ek bir moddur. Bu, kodun cihaza yüksek hızda aktarılmasını daha sağlam hale getirir ve ayrıca alırken daha az RAM kullanır çünkü (standart ham modun aksine) derlemeden önce kodun birebir kopyasını saklaması gerekmez.

Ham yapıştırma modu aşağıdaki protokolü kullanır:

  1. Her zamanki gibi ctrl-A ile ham REPL’e girin.

  2. 3 bayt yazın: b"\x05A\x01" (yani ctrl-E, ardından “A”, ardından ctrl-A).

  3. Cihazın ham yapıştırma moduna girip girmediğini belirlemek için 2 bayt okuyun:

    • Sonuç b"R\x00" ise cihaz komutu anlar ancak ham yapıştırmayı desteklemez.

    • Sonuç b"R\x01" ise cihaz ham yapıştırmayı destekler ve bu moda girmiştir.

    • Aksi takdirde sonuç b"ra" olmalıdır ve cihaz ham yapıştırmayı desteklemez; b"w REPL; CTRL-B to exit\r\n>" dizesi okunup atılmalıdır.

  4. Cihaz ham yapıştırma modundaysa devam edin, aksi takdirde standart ham moda geri dönün.

  5. 2 bayt okuyun; bu, 16 bitlik işaretsiz küçük endian tamsayı olarak saklanan akış denetimi pencere boyutu artışıdır (bayt cinsinden). Kalan pencere boyutu değişkeninin başlangıç değeri bu sayıya ayarlanmalıdır.

  6. Kodu cihaza yazın:

    • Gönderilecek baytlar olduğu sürece, kalan pencere boyutu kadar bayt yazın ve kalan pencere boyutunu yazılan bayt sayısı kadar azaltın.

    • Kalan pencere boyutu 0 ise veya okunmayı bekleyen bir bayt varsa, 1 bayt okuyun. Bu bayt b"\x01" ise kalan pencere boyutunu 5. adımdaki pencere boyutu artışı kadar artırın. Bu bayt b"\x04" ise cihaz veri alımını sonlandırmak istiyor demektir ve cihaza b"\x04" yazılmalı, bundan sonra başka kod gönderilmemelidir. (Not: cihazdan okunmayı bekleyen bir bayt varsa, hemen okunup işlem yapılması gerekmez; kalan pencere boyutu 0’dan büyük olduğu sürece cihaz gelen baytları tüketmeye devam eder.)

  7. Tüm kod cihaza yazıldığında, veri sonunu belirtmek için b"\x04" yazın.

  8. b"\x04" alınana kadar cihazdan okuyun. Bu noktada cihaz, gönderilen tüm kodu almış ve derlemiştir ve onu çalıştırmaktadır.

  9. Cihaz, çalışan kodun ürettiği tüm karakterleri çıktılar. Kod bittiğinde (eğer biterse) b"\x04" çıktılanır, ardından yakalanmayan herhangi bir istisna, ardından tekrar b"\x04" çıktılanır. Daha sonra standart ham REPL’e geri döner ve b">" çıktılar.

Örneğin, normal (dostça) REPL’de yeni bir satırdan başlayarak şunu yazarsanız:

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

Bu durumda cihaz şuna benzer bir yanıt verir:

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

Zaman içinde ayrıştırıldığında bu şöyle görünür:

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

Bu durumda akış denetimi pencere boyutu artışı 128’dir ve başlangıçta hemen kullanılabilen iki pencere değerinde veri vardır; biri başlangıç pencere boyutu artışı değerinden, diğeri de gönderilen açık b"\x01" değerinden gelir. Yani bu, daha fazla gelen akış denetimi karakteri beklemeden veya kontrol etmeden başlangıçta 256 bayta kadar yazılabileceği anlamına gelir.

MicroPython uzaktan kontrol: mpremote aracı, OpenMV Cam’lerde Python kodu çalıştırmak için ham yapıştırma modu da dahil olmak üzere ham REPL’i kullanır.