Mode Interpreter Interaktif MicroPython (alias REPL)

Bagian ini membahas beberapa karakteristik Mode Interpreter Interaktif MicroPython. Istilah yang umum digunakan untuk ini adalah REPL (read-eval-print-loop) yang akan digunakan untuk merujuk ke prompt interaktif ini.

Catatan

OpenMV Cam mengekspos REPL ini melalui port serial USB (CDC) mereka. Hal ini hanya relevan ketika Anda terhubung langsung ke kamera dengan emulator terminal serial (atau alat seperti Kendali jarak jauh MicroPython: mpremote). OpenMV IDE tidak menggunakan REPL — ia berkomunikasi dengan kamera melalui protokol debug terpisah untuk menjalankan skrip, mentransfer file, dan melakukan streaming buffer bingkai. Semua yang dijelaskan di halaman ini hanya berlaku untuk sesi terminal langsung.

Auto-indent

Saat mengetik pernyataan Python yang diakhiri dengan titik dua (misalnya if, for, while), prompt akan berubah menjadi tiga titik (...) dan kursor akan diindentasi sebanyak 4 spasi. Saat Anda menekan return, baris berikutnya akan melanjutkan dengan tingkat indentasi yang sama untuk pernyataan biasa atau satu tingkat indentasi tambahan jika sesuai. Jika Anda menekan tombol backspace, maka satu tingkat indentasi akan dibatalkan.

Jika kursor Anda sudah kembali ke posisi paling awal, menekan RETURN kemudian akan mengeksekusi kode yang telah Anda masukkan. Berikut ini menunjukkan apa yang akan Anda lihat setelah memasukkan pernyataan for (garis bawah menunjukkan di mana kursor berada):

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

Jika Anda kemudian memasukkan pernyataan if, satu tingkat indentasi tambahan akan diberikan:

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

Sekarang masukkan break diikuti dengan RETURN lalu tekan BACKSPACE:

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

Terakhir ketik print(i), tekan RETURN, tekan BACKSPACE lalu tekan RETURN lagi:

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

Auto-indent tidak akan diterapkan jika dua baris sebelumnya semuanya berupa spasi. Ini berarti Anda dapat menyelesaikan memasukkan pernyataan majemuk dengan menekan RETURN dua kali, dan tekanan ketiga akan menyelesaikan dan mengeksekusinya.

Auto-completion

Saat mengetik perintah di REPL, jika baris yang diketik sejauh ini sesuai dengan awal nama sesuatu, maka menekan TAB akan menampilkan kemungkinan hal yang bisa dimasukkan. Misalnya, pertama impor modul machine dengan memasukkan import machine dan menekan RETURN. Kemudian ketik m dan tekan TAB sehingga harusnya diperluas menjadi machine. Masukkan titik . dan tekan TAB lagi. Anda akan melihat sesuatu seperti:

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

Kata akan diperluas sebanyak mungkin sampai ada beberapa kemungkinan yang tersedia. Misalnya, ketik machine.Pin.PULL dan tekan TAB sehingga akan diperluas menjadi machine.Pin.PULL_. Menekan TAB kedua kali akan menampilkan kemungkinan perluasan:

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

Menginterupsi program yang sedang berjalan

Anda dapat menginterupsi program yang sedang berjalan dengan menekan Ctrl-C. Ini akan menimbulkan KeyboardInterrupt yang akan membawa Anda kembali ke REPL, asalkan program Anda tidak mengintersepsi pengecualian KeyboardInterrupt.

Sebagai contoh:

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

Mode tempel

Jika Anda ingin menempelkan beberapa kode ke jendela terminal, fitur auto-indent akan mengganggu hasilnya. Misalnya, jika Anda memiliki kode Python berikut:

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

dan Anda mencoba menempelkannya ke dalam REPL normal, maka Anda akan melihat sesuatu seperti ini:

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

Jika Anda menekan Ctrl-E, maka Anda akan masuk ke mode tempel, yang pada dasarnya menonaktifkan fitur auto-indent, dan mengubah prompt dari >>> menjadi ===. Sebagai contoh:

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

Mode Tempel memungkinkan baris kosong untuk ditempel. Teks yang ditempel dikompilasi seolah-olah itu adalah sebuah file. Menekan Ctrl-D untuk keluar dari mode tempel dan memulai kompilasi.

Soft reset

Sebuah Soft Reset akan mereset interpreter Python, namun mencoba untuk tidak mereset metode koneksi Anda ke OpenMV Cam (USB).

Anda dapat melakukan soft reset dari REPL dengan menekan Ctrl-D, atau dari kode Python Anda dengan mengeksekusi:

machine.soft_reset()

Misalnya, jika Anda mereset OpenMV Cam Anda dan mengeksekusi perintah dir(), Anda akan melihat sesuatu seperti ini:

>>> dir()
['__name__']

Sekarang buat beberapa variabel dan ulangi perintah dir():

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

Sekarang jika Anda menekan Ctrl-D, dan mengulangi perintah dir(), Anda akan melihat bahwa variabel-variabel Anda sudah tidak ada lagi:

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

Untuk informasi lebih lanjut tentang jenis reset dan proses startup, lihat Urutan Reset dan Boot.

Variabel khusus _ (garis bawah)

Saat Anda menggunakan REPL, Anda mungkin melakukan komputasi dan melihat hasilnya. MicroPython menyimpan hasil pernyataan sebelumnya dalam variabel _ (garis bawah). Jadi Anda dapat menggunakan garis bawah untuk menyimpan hasil dalam sebuah variabel. Sebagai contoh:

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

Mode raw dan mode raw-paste

Mode raw (juga disebut raw REPL) bukanlah sesuatu yang biasanya digunakan seseorang. Ini ditujukan untuk penggunaan terprogram dan pada dasarnya berperilaku seperti mode tempel dengan echo dimatikan, dan dengan kontrol aliran opsional.

Mode raw dimasuki menggunakan Ctrl-A. Kemudian Anda mengirimkan kode python Anda, diikuti dengan Ctrl-D. Ctrl-D akan diakui dengan 'OK' dan kemudian kode python akan dikompilasi dan dieksekusi. Output apa pun (atau kesalahan) akan dikirim kembali. Memasukkan Ctrl-B akan keluar dari mode raw dan kembali ke REPL reguler (alias friendly).

Mode raw-paste adalah mode tambahan dalam raw REPL yang menyertakan kontrol aliran, dan yang mengompilasi kode saat menerimanya. Hal ini membuatnya lebih andal untuk transfer kode berkecepatan tinggi ke perangkat, dan juga menggunakan lebih sedikit RAM saat menerima karena tidak perlu menyimpan salinan verbatim kode sebelum dikompilasi (tidak seperti mode raw standar).

Mode raw-paste menggunakan protokol berikut:

  1. Masuk ke raw REPL seperti biasa melalui ctrl-A.

  2. Tulis 3 byte: b"\x05A\x01" (yaitu ctrl-E kemudian "A" kemudian ctrl-A).

  3. Baca 2 byte untuk menentukan apakah perangkat masuk ke mode raw-paste:

    • Jika hasilnya adalah b"R\x00" maka perangkat memahami perintah tersebut tetapi tidak mendukung raw paste.

    • Jika hasilnya adalah b"R\x01" maka perangkat mendukung raw paste dan telah masuk ke mode ini.

    • Jika tidak, hasilnya harus berupa b"ra" dan perangkat tidak mendukung raw paste serta string b"w REPL; CTRL-B to exit\r\n>" harus dibaca dan dibuang.

  4. Jika perangkat berada dalam mode raw-paste maka lanjutkan, jika tidak kembali ke mode raw standar.

  5. Baca 2 byte, ini adalah window-size-increment kontrol aliran (dalam byte) yang disimpan sebagai bilangan bulat unsigned little endian 16-bit. Nilai awal untuk variabel remaining-window-size harus disetel ke angka ini.

  6. Tulis kode ke perangkat:

    • Selama masih ada byte yang akan dikirim, tulis hingga sebanyak remaining-window-size byte, dan kurangi remaining-window-size dengan jumlah byte yang ditulis.

    • Jika remaining-window-size adalah 0, atau ada byte yang menunggu untuk dibaca, baca 1 byte. Jika byte ini adalah b"\x01" maka tambahkan remaining-window-size dengan window-size-increment dari langkah 5. Jika byte ini adalah b"\x04" maka perangkat ingin mengakhiri penerimaan data, dan b"\x04" harus ditulis ke perangkat dan tidak ada lagi kode yang dikirim setelah itu. (Catatan: jika ada byte yang menunggu untuk dibaca dari perangkat maka tidak perlu segera dibaca dan ditindaklanjuti, perangkat akan terus mengonsumsi byte yang masuk selama remaining-window-size lebih besar dari 0.)

  7. Ketika semua kode telah ditulis ke perangkat, tulis b"\x04" untuk menunjukkan akhir data.

  8. Baca dari perangkat hingga diterima b"\x04". Pada titik ini perangkat telah menerima dan mengompilasi semua kode yang dikirim dan sedang mengeksekusinya.

  9. Perangkat mengeluarkan karakter apa pun yang dihasilkan oleh kode yang dieksekusi. Ketika (jika) kode selesai b"\x04" akan dikeluarkan, diikuti oleh pengecualian apa pun yang tidak tertangkap, diikuti lagi oleh b"\x04". Kemudian kembali ke raw REPL standar dan mengeluarkan b">".

Misalnya, mulai dari baris baru di REPL normal (friendly), jika Anda menulis:

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

Maka perangkat akan merespons dengan sesuatu seperti:

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

Dipecah dari waktu ke waktu ini terlihat seperti:

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

Dalam kasus ini window-size-increment kontrol aliran adalah 128 dan ada dua jendela data yang langsung tersedia di awal, satu dari nilai window-size-increment awal dan satu dari nilai b"\x01" eksplisit yang dikirim. Jadi ini berarti hingga 256 byte dapat ditulis untuk memulai sebelum menunggu atau memeriksa karakter kontrol aliran yang masuk lebih banyak.

Alat Kendali jarak jauh MicroPython: mpremote menggunakan raw REPL, termasuk mode raw-paste, untuk mengeksekusi kode Python pada OpenMV Cam.