El modo de intérprete interactivo de MicroPython (también conocido como REPL)¶
Esta sección describe algunas características del modo de intérprete interactivo de MicroPython. Un término de uso común para esto es REPL (read-eval-print-loop), que se utilizará para referirse a este prompt interactivo.
Nota
Las OpenMV Cam exponen este REPL a través de su puerto serie USB (CDC). Solo es relevante cuando te conectas a la cámara directamente con un emulador de terminal serie (o una herramienta como Control remoto de MicroPython: mpremote). OpenMV IDE no usa el REPL — se comunica con la cámara mediante un protocolo de depuración independiente para ejecutar scripts, transferir archivos y transmitir el framebuffer. Todo lo descrito en esta página se aplica únicamente a las sesiones de terminal directas.
Sangría automática¶
Cuando escribes sentencias de Python que terminan en dos puntos (por ejemplo if, for, while), el prompt cambiará a tres puntos (…) y el cursor se sangrará 4 espacios. Cuando pulses intro, la siguiente línea continuará con el mismo nivel de sangría para las sentencias normales o con un nivel adicional de sangría cuando corresponda. Si pulsas la tecla de retroceso, deshará un nivel de sangría.
Si el cursor está completamente al principio, al pulsar INTRO se ejecutará el código que hayas introducido. Lo siguiente muestra lo que verías tras introducir una sentencia for (el guion bajo indica dónde acaba el cursor):
>>> for i in range(30):
... _
Si luego introduces una sentencia if, se proporcionará un nivel adicional de sangría:
>>> for i in range(30):
... if i > 3:
... _
Ahora introduce break seguido de INTRO y pulsa RETROCESO:
>>> for i in range(30):
... if i > 3:
... break
... _
Por último escribe print(i), pulsa INTRO, pulsa RETROCESO y pulsa INTRO de nuevo:
>>> for i in range(30):
... if i > 3:
... break
... print(i)
...
0
1
2
3
>>>
La sangría automática no se aplicará si las dos líneas anteriores eran todo espacios. Esto significa que puedes terminar de introducir una sentencia compuesta pulsando INTRO dos veces, y una tercera pulsación finalizará y ejecutará.
Autocompletado¶
Mientras escribes un comando en el REPL, si la línea escrita hasta el momento corresponde al comienzo del nombre de algo, al pulsar TAB se mostrarán las posibles cosas que podrían introducirse. Por ejemplo, primero importa el módulo machine introduciendo import machine y pulsando INTRO. Luego escribe m y pulsa TAB y debería expandirse a machine. Introduce un punto . y pulsa TAB de nuevo. Deberías ver algo como:
>>> machine.
__name__ info unique_id reset
bootloader freq rng idle
sleep deepsleep disable_irq enable_irq
Pin
La palabra se expandirá tanto como sea posible hasta que existan múltiples posibilidades. Por ejemplo, escribe machine.Pin.PULL y pulsa TAB y se expandirá a machine.Pin.PULL_. Al pulsar TAB por segunda vez se mostrarán las posibles expansiones:
>>> machine.Pin.PULL_
PULL_DOWN PULL_UP
>>> machine.Pin.PULL_
Interrumpir un programa en ejecución¶
Puedes interrumpir un programa en ejecución pulsando Ctrl-C. Esto generará una KeyboardInterrupt que te devolverá al REPL, siempre que tu programa no intercepte la excepción KeyboardInterrupt.
Por ejemplo:
>>> 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:
>>>
Modo de pegado¶
Si quieres pegar algo de código en la ventana de tu terminal, la función de sangría automática lo estropeará. Por ejemplo, si tuvieras el siguiente código de Python:
def foo():
print('This is a test to show paste mode')
print('Here is a second line')
foo()
y tratas de pegar esto en el REPL normal, verás algo como esto:
>>> 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
Si pulsas Ctrl-E, entrarás en el modo de pegado, que básicamente desactiva la función de sangría automática y cambia el prompt de >>> a ===. Por ejemplo:
>>>
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
>>>
El modo de pegado permite pegar líneas en blanco. El texto pegado se compila como si fuera un archivo. Al pulsar Ctrl-D se sale del modo de pegado y se inicia la compilación.
Reinicio suave¶
Un Reinicio en caliente reiniciará el intérprete de Python, pero intenta no reiniciar el método mediante el cual estás conectado a la OpenMV Cam (USB).
Puedes realizar un reinicio suave desde el REPL pulsando Ctrl-D, o desde tu código de Python ejecutando:
machine.soft_reset()
Por ejemplo, si reinicias tu OpenMV Cam y ejecutas un comando dir(), verías algo como esto:
>>> dir()
['__name__']
Ahora crea algunas variables y repite el comando dir():
>>> i = 1
>>> j = 23
>>> x = 'abc'
>>> dir()
['j', 'x', '__name__', 'i']
>>>
Ahora, si introduces Ctrl-D y repites el comando dir(), verás que tus variables ya no existen:
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__']
>>>
Para más información sobre los tipos de reinicio y el proceso de arranque, consulta Secuencia de reinicio y arranque.
La variable especial _ (guion bajo)¶
Cuando usas el REPL, puedes realizar cálculos y ver los resultados. MicroPython almacena el resultado de la sentencia anterior en la variable _ (guion bajo). Así que puedes usar el guion bajo para guardar el resultado en una variable. Por ejemplo:
>>> 1 + 2 + 3 + 4 + 5
15
>>> x = _
>>> x
15
>>>
Modo raw y modo raw-paste¶
El modo raw (también llamado raw REPL) no es algo que una persona usaría normalmente. Está pensado para uso programático y básicamente se comporta como el modo de pegado con el eco desactivado y con control de flujo opcional.
Se entra al modo raw usando Ctrl-A. Luego envías tu código de Python, seguido de un Ctrl-D. El Ctrl-D será confirmado con “OK” y entonces el código de Python se compilará y ejecutará. Cualquier salida (o errores) se devolverá. Al introducir Ctrl-B se saldrá del modo raw y se volverá al REPL normal (también conocido como amigable).
El modo raw-paste es un modo adicional dentro del raw REPL que incluye control de flujo y que compila el código a medida que lo recibe. Esto lo hace más robusto para la transferencia de código a alta velocidad hacia el dispositivo, y además usa menos RAM al recibir porque no necesita almacenar una copia literal del código antes de compilar (a diferencia del modo raw estándar).
El modo raw-paste usa el siguiente protocolo:
Entra al raw REPL como de costumbre mediante ctrl-A.
Escribe 3 bytes:
b"\x05A\x01"(es decir ctrl-E, luego «A» y luego ctrl-A).Lee 2 bytes para determinar si el dispositivo entró en modo raw-paste:
Si el resultado es
b"R\x00"entonces el dispositivo entiende el comando pero no admite raw paste.Si el resultado es
b"R\x01"entonces el dispositivo sí admite raw paste y ha entrado en este modo.De lo contrario, el resultado debería ser
b"ra"y el dispositivo no admite raw paste, y la cadenab"w REPL; CTRL-B to exit\r\n>"debería leerse y descartarse.
Si el dispositivo está en modo raw-paste entonces continúa, de lo contrario recurre al modo raw estándar.
Lee 2 bytes, este es el incremento del tamaño de ventana del control de flujo (en bytes) almacenado como un entero sin signo de 16 bits little endian. El valor inicial de la variable tamaño-de-ventana-restante debería establecerse en este número.
Escribe el código en el dispositivo:
Mientras haya bytes que enviar, escribe hasta el equivalente al tamaño-de-ventana-restante en bytes, y disminuye el tamaño-de-ventana-restante en el número de bytes escritos.
Si el tamaño-de-ventana-restante es 0, o hay un byte esperando a ser leído, lee 1 byte. Si este byte es
b"\x01"entonces incrementa el tamaño-de-ventana-restante en el incremento-del-tamaño-de-ventana del paso 5. Si este byte esb"\x04"entonces el dispositivo quiere finalizar la recepción de datos, y debe escribirseb"\x04"en el dispositivo y no enviarse más código después de eso. (Nota: si hay un byte esperando a ser leído del dispositivo, no es necesario leerlo y actuar sobre él inmediatamente; el dispositivo seguirá consumiendo los bytes entrantes mientras el tamaño-de-ventana-restante sea mayor que 0.)
Cuando todo el código se haya escrito en el dispositivo, escribe
b"\x04"para indicar el fin de los datos.Lee del dispositivo hasta que se reciba
b"\x04". En este punto el dispositivo ha recibido y compilado todo el código que se envió y lo está ejecutando.El dispositivo emite todos los caracteres producidos por el código en ejecución. Cuando (si) el código termina, se emitirá
b"\x04", seguido de cualquier excepción no capturada, seguido de nuevo deb"\x04". Luego vuelve al raw REPL estándar y emiteb">".
Por ejemplo, comenzando en una nueva línea en el REPL normal (amigable), si escribes:
b"\x01\x05A\x01print(123)\x04"
Entonces el dispositivo responderá con algo como:
b"\r\nraw REPL; CTRL-B to exit\r\n>R\x01\x80\x00\x01\x04123\r\n\x04\x04>"
Desglosado a lo largo del tiempo, esto se ve así:
# 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>"
En este caso el incremento-del-tamaño-de-ventana del control de flujo es 128 y hay dos ventanas de datos disponibles inmediatamente al inicio, una del valor inicial del incremento-del-tamaño-de-ventana y otra del valor explícito b"\x01" que se envía. Así que esto significa que se pueden escribir hasta 256 bytes para empezar, antes de esperar o comprobar más caracteres de control de flujo entrantes.
La herramienta Control remoto de MicroPython: mpremote usa el raw REPL, incluido el modo raw-paste, para ejecutar código de Python en las OpenMV Cam.