Der interaktive Interpretermodus von MicroPython (auch REPL genannt)

Dieser Abschnitt behandelt einige Eigenschaften des interaktiven Interpretermodus von MicroPython. Ein häufig verwendeter Begriff hierfür ist REPL (read-eval-print-loop), der zur Bezeichnung dieser interaktiven Eingabeaufforderung verwendet wird.

Bemerkung

OpenMV Cams stellen diese REPL über ihren seriellen USB-Anschluss (CDC) bereit. Sie ist nur relevant, wenn Sie sich direkt mit einem seriellen Terminalemulator (oder einem Werkzeug wie MicroPython-Fernsteuerung: mpremote) mit der Kamera verbinden. OpenMV IDE verwendet die REPL nicht — sie kommuniziert mit der Kamera über ein separates Debug-Protokoll, um Skripte auszuführen, Dateien zu übertragen und den Framebuffer zu streamen. Alles, was auf dieser Seite beschrieben wird, gilt ausschließlich für direkte Terminalsitzungen.

Automatische Einrückung

Wenn Sie Python-Anweisungen eingeben, die mit einem Doppelpunkt enden (zum Beispiel if, for, while), ändert sich die Eingabeaufforderung in drei Punkte (…) und der Cursor wird um 4 Leerzeichen eingerückt. Wenn Sie die Eingabetaste drücken, wird die nächste Zeile bei regulären Anweisungen auf derselben Einrückungsebene fortgesetzt oder, wo es angebracht ist, um eine zusätzliche Ebene eingerückt. Wenn Sie die Rücktaste drücken, wird eine Einrückungsebene rückgängig gemacht.

Wenn sich Ihr Cursor ganz am Anfang befindet, führt das Drücken der EINGABETASTE den eingegebenen Code aus. Im Folgenden sehen Sie, was nach der Eingabe einer for-Anweisung angezeigt wird (der Unterstrich zeigt, wo der Cursor letztlich landet):

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

Wenn Sie anschließend eine if-Anweisung eingeben, wird eine zusätzliche Einrückungsebene hinzugefügt:

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

Geben Sie nun break gefolgt von der EINGABETASTE ein und drücken Sie die RÜCKTASTE:

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

Geben Sie schließlich print(i) ein, drücken Sie die EINGABETASTE, drücken Sie die RÜCKTASTE und drücken Sie erneut die EINGABETASTE:

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

Die automatische Einrückung wird nicht angewendet, wenn die vorherigen beiden Zeilen ausschließlich aus Leerzeichen bestanden. Das bedeutet, dass Sie die Eingabe einer zusammengesetzten Anweisung durch zweimaliges Drücken der EINGABETASTE abschließen können, und ein drittes Drücken sie beendet und ausführt.

Automatische Vervollständigung

Wenn Sie an der REPL einen Befehl eingeben und die bisher eingegebene Zeile dem Anfang eines Namens entspricht, zeigt das Drücken der TAB-Taste mögliche Eingaben an. Importieren Sie zum Beispiel zunächst das Modul machine, indem Sie import machine eingeben und die EINGABETASTE drücken. Geben Sie dann m ein und drücken Sie TAB; es sollte zu machine erweitert werden. Geben Sie einen Punkt . ein und drücken Sie erneut TAB. Sie sollten etwa Folgendes sehen:

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

Das Wort wird so weit wie möglich erweitert, bis mehrere Möglichkeiten bestehen. Geben Sie zum Beispiel machine.Pin.PULL ein und drücken Sie TAB; es wird zu machine.Pin.PULL_ erweitert. Ein zweites Drücken von TAB zeigt die möglichen Erweiterungen:

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

Ein laufendes Programm unterbrechen

Sie können ein laufendes Programm durch Drücken von Strg-C unterbrechen. Dies löst einen KeyboardInterrupt aus, der Sie zur REPL zurückbringt, sofern Ihr Programm die KeyboardInterrupt-Ausnahme nicht abfängt.

Zum Beispiel:

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

Einfügemodus (Paste Mode)

Wenn Sie Code in Ihr Terminalfenster einfügen möchten, bringt die automatische Einrückung die Dinge durcheinander. Angenommen, Sie haben den folgenden Python-Code:

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

Wenn Sie versuchen, diesen in die normale REPL einzufügen, sehen Sie etwa Folgendes:

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

Wenn Sie Strg-E drücken, gelangen Sie in den Einfügemodus, der im Wesentlichen die automatische Einrückung ausschaltet und die Eingabeaufforderung von >>> in === ändert. Zum Beispiel:

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

Der Einfügemodus erlaubt das Einfügen von Leerzeilen. Der eingefügte Text wird so kompiliert, als wäre er eine Datei. Das Drücken von Strg-D verlässt den Einfügemodus und startet die Kompilierung.

Soft-Reset

Ein Soft-Reset setzt den Python-Interpreter zurück, versucht aber, die Verbindungsmethode zur OpenMV Cam (USB) nicht zurückzusetzen.

Sie können einen Soft-Reset von der REPL aus durch Drücken von Strg-D ausführen oder aus Ihrem Python-Code, indem Sie Folgendes ausführen:

machine.soft_reset()

Wenn Sie zum Beispiel Ihre OpenMV Cam zurücksetzen und einen dir()-Befehl ausführen, sehen Sie etwa Folgendes:

>>> dir()
['__name__']

Erstellen Sie nun einige Variablen und wiederholen Sie den dir()-Befehl:

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

Wenn Sie nun Strg-D eingeben und den dir()-Befehl wiederholen, werden Sie sehen, dass Ihre Variablen nicht mehr existieren:

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

Weitere Informationen zu den Reset-Typen und zum Startvorgang finden Sie unter Reset- und Boot-Sequenz.

Die spezielle Variable _ (Unterstrich)

Wenn Sie die REPL verwenden, können Sie Berechnungen durchführen und die Ergebnisse sehen. MicroPython speichert das Ergebnis der vorherigen Anweisung in der Variable _ (Unterstrich). So können Sie den Unterstrich verwenden, um das Ergebnis in einer Variablen zu speichern. Zum Beispiel:

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

Raw-Modus und Raw-Paste-Modus

Der Raw-Modus (auch Raw-REPL genannt) ist nichts, was eine Person normalerweise verwenden würde. Er ist für die programmatische Nutzung gedacht und verhält sich im Wesentlichen wie der Einfügemodus mit ausgeschaltetem Echo und optionaler Flusskontrolle.

Der Raw-Modus wird mit Strg-A betreten. Sie senden dann Ihren Python-Code, gefolgt von einem Strg-D. Das Strg-D wird mit ‚OK‘ bestätigt, und anschließend wird der Python-Code kompiliert und ausgeführt. Jegliche Ausgabe (oder Fehler) wird zurückgesendet. Durch Eingabe von Strg-B verlassen Sie den Raw-Modus und kehren zur regulären (auch freundlich genannten) REPL zurück.

Der Raw-Paste-Modus ist ein zusätzlicher Modus innerhalb der Raw-REPL, der Flusskontrolle umfasst und Code kompiliert, während er ihn empfängt. Dies macht ihn robuster für die schnelle Übertragung von Code in das Gerät, und er verbraucht außerdem weniger RAM beim Empfang, da er keine wörtliche Kopie des Codes vor dem Kompilieren speichern muss (im Gegensatz zum Standard-Raw-Modus).

Der Raw-Paste-Modus verwendet das folgende Protokoll:

  1. Betreten Sie die Raw-REPL wie üblich über Strg-A.

  2. Schreiben Sie 3 Bytes: b"\x05A\x01" (d. h. Strg-E, dann „A“, dann Strg-A).

  3. Lesen Sie 2 Bytes, um festzustellen, ob das Gerät in den Raw-Paste-Modus gewechselt ist:

    • Wenn das Ergebnis b"R\x00" ist, versteht das Gerät den Befehl, unterstützt aber kein Raw-Paste.

    • Wenn das Ergebnis b"R\x01" ist, unterstützt das Gerät Raw-Paste und hat diesen Modus betreten.

    • Andernfalls sollte das Ergebnis b"ra" sein; das Gerät unterstützt kein Raw-Paste, und die Zeichenkette b"w REPL; CTRL-B to exit\r\n>" sollte gelesen und verworfen werden.

  4. Wenn sich das Gerät im Raw-Paste-Modus befindet, fahren Sie fort, andernfalls greifen Sie auf den Standard-Raw-Modus zurück.

  5. Lesen Sie 2 Bytes; dies ist das Inkrement der FensterGröße für die Flusskontrolle (in Bytes), gespeichert als vorzeichenlose 16-Bit-Ganzzahl im Little-Endian-Format. Der Anfangswert der Variablen für die verbleibende Fenstergröße sollte auf diese Zahl gesetzt werden.

  6. Schreiben Sie den Code an das Gerät:

    • Solange Bytes zu senden sind, schreiben Sie bis zu der verbleibenden Fenstergröße entsprechenden Anzahl von Bytes und verringern Sie die verbleibende Fenstergröße um die Anzahl der geschriebenen Bytes.

    • Wenn die verbleibende Fenstergröße 0 ist oder ein Byte zum Lesen bereitsteht, lesen Sie 1 Byte. Wenn dieses Byte b"\x01" ist, erhöhen Sie die verbleibende Fenstergröße um das Fenstergrößen-Inkrement aus Schritt 5. Wenn dieses Byte b"\x04" ist, möchte das Gerät den Datenempfang beenden, und b"\x04" sollte an das Gerät geschrieben werden, woraufhin kein weiterer Code mehr gesendet wird. (Hinweis: Wenn ein Byte vom Gerät zum Lesen bereitsteht, muss es nicht sofort gelesen und verarbeitet werden; das Gerät verarbeitet eingehende Bytes weiterhin, solange die verbleibende Fenstergröße größer als 0 ist.)

  7. Wenn der gesamte Code an das Gerät geschrieben wurde, schreiben Sie b"\x04", um das Ende der Daten anzuzeigen.

  8. Lesen Sie vom Gerät, bis b"\x04" empfangen wird. An diesem Punkt hat das Gerät den gesamten gesendeten Code empfangen und kompiliert und führt ihn aus.

  9. Das Gerät gibt alle vom ausgeführten Code erzeugten Zeichen aus. Wenn (sofern) der Code beendet ist, wird b"\x04" ausgegeben, gefolgt von einer nicht abgefangenen Ausnahme, gefolgt von erneutem b"\x04". Anschließend kehrt es zur Standard-Raw-REPL zurück und gibt b">" aus.

Wenn Sie zum Beispiel an einer neuen Zeile in der normalen (freundlichen) REPL Folgendes schreiben:

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

Dann antwortet das Gerät mit etwa Folgendem:

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

Zeitlich aufgeschlüsselt sieht das so aus:

# 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 diesem Fall beträgt das Inkrement der FensterGröße für die Flusskontrolle 128, und zu Beginn sind sofort zwei Fenster an Daten verfügbar: eines aus dem anfänglichen Fenstergrößen-Inkrement und eines aus dem explizit gesendeten Wert b"\x01". Das bedeutet, dass zu Beginn bis zu 256 Bytes geschrieben werden können, bevor auf weitere eingehende Flusskontrollzeichen gewartet bzw. geprüft wird.

Das Werkzeug MicroPython-Fernsteuerung: mpremote verwendet die Raw-REPL, einschließlich des Raw-Paste-Modus, um Python-Code auf OpenMV Cams auszuführen.