Tu país

Las herramientas que lo admiten usan tu país para la moneda local, el formato de los números, las unidades y el tamaño del papel. Tu elección se guarda solo en este navegador.

Escribe un nombre o un código de dos letras. Usa las flechas arriba y abajo para recorrer los países, Intro para elegir uno y Escape para cerrar.

Python  Módulo 1 – Primeros pasos: instalar, ejecutar y leer Python

Qué es Python y cómo ejecuta tu código

Qué pasa cuando ejecutas un archivo .py (CPython lo compila a bytecode y lo ejecuta), cuánto tiempo se mantiene cada versión y qué implementaciones existen.

Lección gratis, respuestas Pro: 20 minutos
Gratis: la lección completa. Con un pase: las respuestas modelo de sus 2 preguntas de entrevista.

Qué vas a aprender

  • Explicar qué hace el intérprete cuando ejecuta un archivo .py
  • Encontrar dónde guarda CPython el bytecode de un módulo importado, y cuándo vuelve a compilarlo
  • Reconocer si una versión es de funcionalidades o de corrección de errores, y cuánto tiempo recibe soporte
  • Distinguir CPython de otras implementaciones como PyPy y Pyodide
Qué vas a aprender

Qué vas a aprender

  • Explicar qué hace el intérprete cuando ejecuta un archivo .py
  • Encontrar dónde guarda CPython el bytecode de un módulo importado, y cuándo vuelve a compilarlo
  • Reconocer si una versión es de funcionalidades o de corrección de errores, y cuánto tiempo recibe soporte
  • Distinguir CPython de otras implementaciones como PyPy y Pyodide
En esta página

Un archivo de tres líneas con un ) de más en su última línea no imprime nada, mientras que el mismo archivo con una división entre cero en esa línea imprime sus dos primeras líneas antes de detenerse. La diferencia viene de los dos pasos de ejecutar un archivo: Python primero lo compila entero y después lo ejecuta.

Python is a general-purpose programming language with a small, readable syntax: blocks are marked by indentation rather than braces, and you do not declare the types of variables. It comes with a large standard library: The modules that come with Python itself, such as json, pathlib and sqlite3, documented in the library reference. sys.stdlib_module_names lists their names for the Python that runs, whether or not each one works there. More in “A tour of the Python standard library” (en inglés), so many everyday jobs (reading files, handling dates, talking to the web) need nothing extra. People use it for scripts and automation, web back ends, data analysis, machine learning, teaching and much more. “Python” names two things: the language (the rules for what a program means, written down in the language reference) and the implementation: A program that runs code written in Python, such as CPython, PyPy or MicroPython. The language reference says what code means; each implementation decides how to run it and fills in what the reference leaves open, such as when objects are freed., the program that actually runs your code. Most of the time the implementation is CPython, and this lesson is about what it does.

Ejecutar un archivo lo compila entero antes de que se ejecute ninguna línea

Cuando ejecutas python3 hello.py, pasan tres cosas, en este orden:

  1. El intérprete lee tu código fuente, el texto de hello.py.
  2. Compila el archivo entero a Las instrucciones compactas en las que CPython compila un archivo de Python antes de ejecutarlas en su máquina virtual. Cambian de una versión de funcionalidades a la siguiente, y el módulo dis las muestra.: instrucciones compactas para la máquina virtual propia de Python. Si el archivo tiene un error de sintaxis, se detiene aquí, antes de que se ejecute una sola línea.
  3. Después, la La parte de CPython que ejecuta el bytecode, una instrucción tras otra. Los errores que solo aparecen mientras el programa se ejecuta, como una división entre cero, se lanzan aquí. ejecuta el bytecode, una instrucción tras otra. Los errores que solo aparecen mientras el programa se ejecuta, como dividir entre cero, ocurren en este paso.
Ejecutar hello.py: CPython lee el archivo, lo compila a bytecode, y su máquina virtual ejecuta el bytecode para imprimir la salida.hello.py(código fuente)CompiladorUn SyntaxError para aquí,antes de ejecutar ninguna líneaBytecodeinstrucciones para lamáquina virtualMáquina virtualZeroDivisionError y otroserrores de ejecución ocurren aquíSalida1. leer2. compilar3. ejecutar

Lo que hace CPython cuando ejecutas un archivo

Descripción en texto del diagrama

El diagrama muestra los tres pasos de ejecutar python3 hello.py, de arriba abajo.

  1. Python lee el código fuente de hello.py.
  2. El compilador convierte el archivo entero en bytecode, instrucciones para la máquina virtual de Python. Un SyntaxError detiene el programa en este paso, antes de que se ejecute ninguna de sus líneas.
  3. La máquina virtual ejecuta el bytecode, una instrucción tras otra, y aparece la salida del programa. Un ZeroDivisionError y los demás errores que solo aparecen mientras el programa se ejecuta ocurren en este paso.

Estos son los dos archivos del principio de la lección. Solo se diferencian en la línea 3: uno divide entre cero y el otro tiene un ) de más. Mira la salida de cada pestaña y después recorre paso a paso lo que hace CPython con los dos archivos:

Dos archivos, dos tipos de error

Una división entre cero · late_zero_division.py

print("Line 1 ran")
print("Line 2 ran")
print(10 / 0)

Salida (código de salida 1)

Line 1 ran
Line 2 ran

Impreso como error (salida de errores estándar)

Traceback (most recent call last):
  File "late_zero_division.py", line 3, in <module>
    print(10 / 0)
          ~~~^~~
ZeroDivisionError: division by zero

Salida registrada con Python 3.14.8 en macOS 26 arm64. Para ejecutarlo tú: mise exec python@3.14.8 -- python3 late_zero_division.py

Un paréntesis de más · late_syntax_error.py

print("Line 1 ran")
print("Line 2 ran")
print(10 / 2))

Salida (código de salida 1)

Impreso como error (salida de errores estándar)

  File "late_syntax_error.py", line 3
    print(10 / 2))
                 ^
SyntaxError: unmatched ')'

Salida registrada con Python 3.14.8 en macOS 26 arm64. Para ejecutarlo tú: mise exec python@3.14.8 -- python3 late_syntax_error.py

Interactivo · etapa por etapa Dos archivos al compilarse y ejecutarse Recorre el archivo que divide entre cero y después el que tiene un paréntesis de más, y mira dónde se detiene cada uno.
Dos archivos al compilarse y ejecutarse, paso 7 de 7. Se ve: Leer el código fuente (late_syntax_error.py), Compilar el archivo entero (comprueba las líneas 1, 2 y 3), Ejecutar el bytecode (nunca empezó), Salida (solo el informe del SyntaxError). Resaltado: Salida.Leer el código fuentelate_syntax_error.pyCompilar el archivo enterocomprueba las líneas 1, 2 y 3Ejecutar el bytecodenunca empezóSalidasolo el informe del SyntaxError

El dibujo muestra la escena completa; sus 7 pasos aparecen abajo.

Todos los pasos en texto
  1. Leer el primer archivo. python3 late_zero_division.py hace que CPython lea las tres líneas del archivo antes de hacer nada con ellas.
  2. Compilar las tres líneas. El compilador comprueba la gramática de cada línea y convierte el archivo en bytecode. print(10 / 0) es gramática correcta, así que la compilación sale bien.
  3. Se ejecutan las líneas 1 y 2. La máquina virtual ejecuta el bytecode en orden, así que las llamadas a print() de las líneas 1 y 2 escriben sus dos líneas.
  4. La línea 3 falla al ejecutarse. Solo ahora se ejecuta la división entre cero. El ZeroDivisionError viene de la máquina virtual, después de imprimirse dos líneas, y el traceback señala la línea 3.
  5. El segundo archivo. python3 late_syntax_error.py lee tres líneas que solo se diferencian en la línea 3, que tiene un ) de más: print(10 / 2)).
  6. La compilación se detiene en la línea 3. El compilador lee las tres líneas antes de que se ejecute nada, encuentra el paréntesis de más y se detiene con un SyntaxError. No se genera bytecode.
  7. No se imprimió nada. Las líneas 1 y 2 nunca se ejecutaron, así que la única salida es el informe del error. Un error de gramática en cualquier parte de un archivo impide que se ejecute cualquiera de sus líneas.

La división es gramática correcta, así que el archivo entero se compiló y sus dos primeras líneas se ejecutaron antes de que la máquina virtual llegara a la línea 3. El paréntesis de más rompió la gramática, así que la compilación se detuvo y no se ejecutó nada, ni siquiera la línea 1. Abre la segunda pestaña, pulsa Editar, borra el ) de más y pulsa Ejecutar: ahora se imprimen las tres líneas.

Idea clave

CPython compila el archivo entero antes de ejecutar nada: un error de gramática en cualquier parte detiene el archivo antes de su primera línea, mientras que un error en tiempo de ejecución solo lo detiene cuando se llega a su línea.

No hay una orden separada de “compilar y después ejecutar”, como en C o en Java: los dos pasos ocurren cada vez que ejecutas el archivo. El módulo dis de la biblioteca estándar (abreviatura de disassembler, desensamblador) te muestra el bytecode de una función:

El bytecode de una función pequeña Python · show_bytecode.py
import dis


def add(a, b):
    return a + b


dis.dis(add)

Salida

  4           RESUME                   0

  5           LOAD_FAST_BORROW_LOAD_FAST_BORROW 1 (a, b)
              BINARY_OP                0 (+)
              RETURN_VALUE

Salida registrada con Python 3.14.8 en macOS 26 arm64. Para ejecutarlo tú: mise exec python@3.14.8 -- python3 show_bytecode.py

Cada línea de la salida es una instrucción. RESUME es contabilidad interna al principio de cada función; después, la máquina virtual toma los dos argumentos, los suma con el operador + y devuelve el resultado. Nunca necesitas leer bytecode para escribir Python, pero explica por qué un error de sintaxis en cualquier parte de un archivo impide que se ejecute el archivo entero.

Nota de versión

El bytecode es un detalle de CPython, no forma parte del lenguaje: sus instrucciones cambian de una versión de funcionalidades a la siguiente. La salida de arriba es lo que imprime CPython 3.14; nunca escribas código que dependa de ella.

Punto de control

Comprueba: compilar el archivo entero y después ejecutarlo

  1. Pregunta 1 de 2 Un archivo de cinco líneas imprime una línea en la línea 2, divide entre cero en la línea 4 y deja un paréntesis sin cerrar en la línea 5. ¿Qué imprime python3 cuando ejecuta el archivo?

    Elige una respuesta.

    Una pista

    ¿Con cuál de los dos errores se encuentra CPython primero, al compilar o al ejecutar?

    Ver la respuesta: pregunta 1 de 2

    Respuesta: Solo el informe de un SyntaxError, y no se ejecuta ninguna línea del archivo

    CPython primero compila el archivo entero a bytecode, lo que comprueba la gramática de cada línea. El paréntesis sin cerrar de la línea 5 lo detiene ahí, así que no se genera bytecode y no se ejecuta nada, ni siquiera la línea 2. La división entre cero solo se encontraría al ejecutarse la línea 4, lo que nunca ocurre.

  2. Pregunta 2 de 2 ¿Cuándo se da cuenta CPython de que una línea de tu archivo divide entre cero?

    Elige una respuesta.

    Ver la respuesta: pregunta 2 de 2

    Respuesta: Cuando la máquina virtual ejecuta esa línea, después de ejecutar las anteriores

    Los errores que dependen de los valores, como una división entre cero, son errores en tiempo de ejecución: la máquina virtual los lanza cuando ejecuta la línea. Por eso late_zero_division.py imprimió sus dos primeras líneas antes de detenerse.

Los módulos importados guardan su bytecode para la siguiente ejecución

Cuando un programa importa un módulo (otro archivo .py), CPython guarda el bytecode de ese módulo en una carpeta llamada La carpeta en la que CPython guarda el bytecode de los módulos importados, en archivos como greeting.cpython-314.pyc. Un archivo se vuelve a compilar cuando cambia su código fuente, y la carpeta se puede borrar sin problema. junto a él, para que la siguiente ejecución no tenga que volver a compilarlo. Aquí tienes un programa en dos archivos: main.py, el programa que ejecutas, y greeting.py, el módulo que importa.

Un programa en dos archivos

cache_demo/main.py

import greeting

print(greeting.greet("Asha"))

Salida

Hello, Asha!

Salida registrada con Python 3.14.8 en macOS 26 arm64. Para ejecutarlo tú: mise exec python@3.14.8 -- python3 main.py

cache_demo/greeting.py

def greet(name):
    return "Hello, " + name + "!"

Después de que python3 main.py se haya ejecutado una vez, __pycache__ contiene greeting.cpython-314.pyc. La parte cpython-314 dice qué implementación y qué versión lo escribieron, para que varias versiones de Python puedan compartir una carpeta sin mezclar sus archivos. El archivo que ejecutas directamente, main.py, se compila cada vez y no se guarda en caché.

Antes de usar un archivo de caché, CPython comprueba que sigue coincidiendo con su código fuente. Cuando escribe el archivo, anota dentro la fecha de última modificación y el tamaño del código fuente; si alguno ha cambiado desde entonces, el módulo se vuelve a compilar y el archivo de caché se sustituye. Recorre tres ejecuciones del programa, con un cambio en greeting.py antes de la tercera:

Interactivo · paso a paso Tres ejecuciones de main.py y su caché de bytecode Recorre dos ejecuciones del programa, un cambio en greeting.py y una tercera ejecución. El recuadro de la derecha es la carpeta __pycache__.
Tres ejecuciones de main.py y su caché de bytecode, paso 8 de 8. Se ve: main.py, greeting.py (editado y guardado), Compilador, __pycache__ (archivo .pyc reescrito). Resaltado: __pycache__.main.pyel archivo que ejecutasgreeting.pyeditado y guardadoCompiladorconvierte el código fuente en bytecode__pycache__archivo .pyc reescritoarchivo .pyc nuevo

El dibujo muestra la escena completa; sus 8 pasos aparecen abajo.

Todos los pasos en texto
  1. Ejecución 1: main.py. python3 main.py compila main.py, el archivo que ejecutas. Su bytecode se usa solo en esta ejecución y nunca se guarda.
  2. Ejecución 1: import greeting. La línea 1 importa greeting. Todavía no hay ninguna copia en caché, así que CPython compila también greeting.py.
  3. Ejecución 1: se escribe la caché. CPython guarda el bytecode de greeting.py en __pycache__, en un archivo con el nombre de la implementación y la versión que lo escribieron, con la fecha de modificación y el tamaño del código fuente anotados dentro.
  4. Ejecución 2: main.py otra vez. El segundo python3 main.py vuelve a compilar main.py, como hace cada ejecución: el archivo que ejecutas nunca se guarda en caché.
  5. Ejecución 2: se usa la caché. La importación encuentra greeting.cpython-314.pyc. La fecha y el tamaño anotados coinciden con greeting.py, así que CPython carga el bytecode y no compila greeting.py.
  6. Editas greeting.py. Al guardar greeting.py, el archivo recibe una nueva fecha de modificación, así que ya no coincide con la anotada en el archivo de caché.
  7. Ejecución 3: se vuelve a compilar. En la siguiente importación, CPython ve la diferencia y vuelve a compilar greeting.py. Borrar __pycache__ tendría el mismo efecto.
  8. Ejecución 3: un archivo de caché nuevo. El bytecode nuevo sustituye al archivo antiguo, con la nueva fecha y el nuevo tamaño dentro, para que la siguiente ejecución pueda volver a cargarlo sin compilar.

La segunda ejecución cargó el bytecode de la caché, y el cambio hizo que la tercera volviera a compilar greeting.py, sin que nadie borrara nada. La parte del nombre que dice qué Python escribió el archivo es la etiqueta de caché del Python que se ejecuta, y la biblioteca estándar puede calcular la ruta completa para cualquier archivo fuente:

Dónde va el bytecode de greeting.py Python · cache_name.py
import importlib.util
import sys

print("Cache tag:", sys.implementation.cache_tag)
print(importlib.util.cache_from_source("greeting.py"))

Salida

Cache tag: cpython-314
__pycache__/greeting.cpython-314.pyc

Salida registrada con Python 3.14.8 en macOS 26 arm64. Para ejecutarlo tú: mise exec python@3.14.8 -- python3 cache_name.py

Pulsa Editar, pide "marks.py" en lugar de "greeting.py" y vuelve a ejecutarlo: la carpeta y la etiqueta se mantienen, solo cambia el nombre del módulo.

Esperar que la caché haga que un programa se ejecute más rápido

Un archivo .pyc en caché solo ahorra la compilación, una vez por cada cambio del módulo. El tutorial de Python señala que un programa no se ejecuta más rápido desde un archivo .pyc que desde su archivo .py; solo se carga más rápido. Así que subir __pycache__ a un proyecto no aporta nada: CPython escribe la caché él solo la primera vez que importa cada módulo.

Puedes borrar las carpetas __pycache__ cuando quieras; Python las vuelve a escribir cuando las necesita. Déjalas fuera del control de versiones (añade __pycache__/ a tu .gitignore).

Punto de control

Comprueba: la caché de bytecode de los módulos importados

  1. Pregunta 1 de 2 Ejecutas python3 main.py, después editas y guardas greeting.py, el módulo que importa, y vuelves a ejecutar python3 main.py. ¿Qué hace CPython con el bytecode de greeting?

    Elige una respuesta.

    Una pista

    ¿Qué anota el archivo de caché sobre el código fuente del que se compiló?

    Ver la respuesta: pregunta 1 de 2

    Respuesta: Ve que la fecha de modificación de greeting.py ya no coincide con la caché, lo vuelve a compilar y reescribe el archivo de caché

    Antes de cargar un archivo .pyc, CPython compara la fecha de modificación y el tamaño del código fuente, anotados en el archivo de caché, con el propio archivo fuente. Después de un cambio son distintos, así que vuelve a compilar greeting.py y escribe un archivo de caché nuevo.

  2. Pregunta 2 de 2 Después de que python3 main.py se haya ejecutado una vez, ¿qué archivo contiene __pycache__?

    Elige una respuesta.

    Ver la respuesta: pregunta 2 de 2

    Respuesta: greeting.cpython-314.pyc, el bytecode solo del módulo importado

    CPython guarda en caché el bytecode de los módulos que importa un programa, aquí greeting.py como greeting.cpython-314.pyc. El archivo que ejecutas directamente, main.py, se compila cada vez y no se guarda.

Una versión de funcionalidades cada año, cada una con correcciones durante cinco años

Todo el código actual de Python es Python 3. Python 2 no recibe correcciones desde hace años, pero su código todavía aparece en respuestas antiguas en internet, y falla en Python 3:

Código de Python 2 en Python 3 Python · python2_print.py
# Python 2 code that still turns up in old answers online
print "Hello, world"

Salida (código de salida 1)

Impreso como error (salida de errores estándar)

  File "python2_print.py", line 2
    print "Hello, world"
    ^^^^^^^^^^^^^^^^^^^^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?

Salida registrada con Python 3.14.8 en macOS 26 arm64. Para ejecutarlo tú: mise exec python@3.14.8 -- python3 python2_print.py

Python 3 informa de un SyntaxError e incluso sugiere la solución: print es una función, así que necesita paréntesis. Otras señales de código de Python 2 son raw_input() (ahora input()) y xrange() (ahora range()).

Dentro de Python 3, las versiones se numeran 3.menor.micro:

  • Una Una versión de Python que añade funcionalidades al lenguaje, como 3.14 o 3.15. Sale una cada año y recibe soporte durante cinco años: unos dos de versiones de corrección de errores y después solo correcciones de seguridad. (3.13, 3.14, 3.15…) añade funcionalidades al lenguaje y llega más o menos una vez al año.
  • Después, cada versión de funcionalidades recibe Una versión como 3.14.8 que corrige errores de una versión de funcionalidades y no cambia ninguna de sus funcionalidades, así que el código escrito para 3.14.2 normalmente funciona en ella sin cambios. (3.14.1, 3.14.2…) durante unos dos años, y después solo correcciones de seguridad, hasta unos cinco años después de su salida. La Python Developer’s Guide recoge el estado de cada versión.
  • Una versión de corrección de errores no cambia funcionalidades, así que el código escrito para 3.14.2 normalmente funciona sin cambios en 3.14.8.

El ciclo anual, descrito en la PEP 602, da a cada versión de funcionalidades la misma vida. Recorre las fases de una, 3.14, desde su primera versión alfa hasta su fin de vida:

Cronología · 7 momentos en orden La vida de una versión de funcionalidades, 3.14 Recorre las fases en orden, desde la primera versión alfa hasta el fin del soporte. Cada fase tiene su propio tipo de versión.
  1. 3.14.0a1

    Las versiones alfa añaden las funcionalidades nuevas funcionalidades nuevas

    Durante unos siete meses, versiones alfa numeradas añaden las funcionalidades nuevas una a una, con correcciones de errores. Una alfa indica alpha en sys.version_info.releaselevel.

  2. 3.14.0b1

    Las versiones beta congelan las funcionalidades

    A partir de la primera de las cuatro betas no se puede añadir ninguna funcionalidad nueva, solo correcciones de errores, para que los proyectos puedan probar su código con lo que se va a publicar.

  3. 3.14.0rc1

    Candidatas a versión final

    Siguen al menos dos candidatas a versión final. Su nivel de versión es candidate; la última se convierte en la versión de funcionalidades.

  4. 3.14.0

    La versión de funcionalidades

    3.14.0 sale un año después de 3.13.0, y aquí empiezan sus cinco años de soporte. Su nivel de versión es final.

  5. 3.14.1, 3.14.2 …

    Versiones de corrección de errores durante dos años sin funcionalidades nuevas

    Más o menos cada dos meses, una versión de corrección de errores corrige fallos, con instaladores nuevos, y no cambia ninguna funcionalidad. Los ejemplos de este curso se ejecutan en una de ellas, 3.14.8.

  6. Solo seguridad

    Correcciones de seguridad durante tres años más

    Pasados dos años, solo se hacen correcciones de seguridad, como versiones de solo código fuente cuando hacen falta, y ya no hay instaladores nuevos.

  7. Fin de vida

    Cinco años después de 3.14.0

    El soporte termina. Los programas siguen funcionando, pero ya no se corrige nada del intérprete ni de su biblioteca estándar para 3.14, así que pasa a una versión de funcionalidades más nueva antes de esa fecha.

La cronología tiene 7 momentos, de 3.14.0a1 al fin de vida.

Las fases anteriores a la versión de funcionalidades son para hacer pruebas; tu código debe ir en una versión final que todavía tenga soporte. Un programa puede leer qué versión de funcionalidades lo ejecuta, y en qué fase de esa vida está, en sys.version_info:

¿Qué versión de funcionalidades es esta? Python · version_parts.py
import sys

major, minor = sys.version_info.major, sys.version_info.minor
print("Feature release:", f"{major}.{minor}")
print("Release level:", sys.version_info.releaselevel)

Salida

Feature release: 3.14
Release level: final

Salida registrada con Python 3.14.8 en macOS 26 arm64. Para ejecutarlo tú: mise exec python@3.14.8 -- python3 version_parts.py

Este curso está escrito para Python 3.14, y sus ejemplos se ejecutan con CPython 3.14.8.

Punto de control

Comprueba: versiones de funcionalidades, versiones de corrección y soporte

  1. Pregunta 1 de 2 Tu programa se escribió y se probó en Python 3.14.2. ¿Funcionará normalmente sin cambios en 3.14.8?

    Elige una respuesta.

    Ver la respuesta: pregunta 1 de 2

    Respuesta: Sí, porque 3.14.8 es una versión de corrección de errores de la misma versión de funcionalidades y no cambia ninguna funcionalidad

    Las versiones se numeran 3.menor.micro. Una versión de corrección de errores solo cambia el tercer número y no cambia ninguna funcionalidad, así que el código escrito para 3.14.2 normalmente funciona sin cambios en 3.14.8.

  2. Pregunta 2 de 2 Una versión de funcionalidades salió hace dos años y acaba de tener su última versión de corrección de errores. ¿Durante cuántos años más, más o menos, recibirá correcciones de seguridad?

    Escribe un número.

    Una pista

    El soporte dura cinco años en total.

    Ver la respuesta: pregunta 2 de 2

    Respuesta: 3 años

    Una versión de funcionalidades tiene cinco años de soporte: unos dos años con versiones de corrección de errores y, a partir de ahí, solo correcciones de seguridad. Han pasado dos años, así que le quedan unos tres años de correcciones de seguridad antes de su fin de vida.

CPython ejecuta tu código, y otras implementaciones lo ejecutan en otros lugares

El Python que descargas de python.org es CPython, la implementación de referencia, escrita en C. Otras ejecutan el mismo lenguaje en otros lugares:

  • PyPy añade un Un compilador que convierte en código máquina las partes de un programa que más se ejecutan, mientras el programa se ejecuta, para que esas partes vayan más rápido cuanto más tiempo lleva en marcha., que puede hacer mucho más rápidos los programas que se ejecutan durante mucho tiempo.
  • MicroPython es un Python pequeño para microcontroladores.
  • Pyodide is CPython compiled to WebAssembly: A portable binary format for programs, which browsers and runtimes such as Node.js run in a sandbox. Programs written in C, such as CPython, can be compiled to it., so it runs inside a web browser, on your own device.

Un programa puede preguntar qué implementación, qué versión y qué plataforma lo están ejecutando:

¿Qué Python se está ejecutando? Python · runtime_info.py
import sys

print("Implementation:", sys.implementation.name)
print("Version:", sys.version.split()[0])
print("Platform:", sys.platform)

Salida

Implementation: cpython
Version: 3.14.8
Platform: darwin

Salida registrada con Python 3.14.8 en macOS 26 arm64. Para ejecutarlo tú: mise exec python@3.14.8 -- python3 runtime_info.py

Nota de versión

El Compilador de Python en línea (en inglés) de este sitio ejecuta Pyodide 314.0.7 en tu navegador, y Pyodide 314.0.7 contiene CPython 3.14.2, así que la versión que indica es 3.14.2. Su plataforma es emscripten, el nombre de Python compilado con Emscripten para WebAssembly. Los dos son Python 3.14, así que los ejemplos de este curso se comportan igual en ambos, salvo que una lección diga lo contrario.

En tu navegador, Pyodide 314.0.7 (CPython 3.14.2) imprime:

Implementation: cpython
Version: 3.14.2
Platform: emscripten

Pulsa Ejecutar y compara las dos respuestas. El Python del navegador sigue llamándose cpython, porque Pyodide es CPython compilado para el navegador; solo la plataforma dice dónde se ejecuta. Cada implementación pone su propio nombre en sys.implementation.name, siempre en minúsculas, así que un programa que necesite saberlo pregunta ahí, y pregunta a sys.platform cuando necesita saber si se ejecuta en un navegador.

Compilador de Python en línea (en inglés) Ejecuta los ejemplos de esta lección en tu navegador, sin instalar nada.

Punto de control

Comprueba: CPython y las otras implementaciones

  1. Una pregunta runtime_info.py se ejecuta en el ejecutor del navegador de este sitio. ¿Qué imprime después de Implementation:?

    Elige una respuesta.

    Una pista

    ¿De qué está hecho Pyodide?

    Ver la respuesta: una pregunta

    Respuesta: cpython, porque Pyodide es CPython compilado a WebAssembly

    sys.implementation.name da el nombre de la implementación, en minúsculas: cpython tanto en una computadora como en el navegador, porque Pyodide es CPython compilado a WebAssembly. Lo que cambia es la plataforma: darwin, linux o win32 en una computadora, emscripten en el navegador.

Practica: informa de qué Python se ejecuta

Escribe describe_runtime(), que le dice a un programa qué implementación y qué versión de funcionalidades lo ejecutan y si se ejecuta en un navegador. Sus pruebas de ejemplo se ejecutan aquí, en tu navegador, así que aquí la respuesta a “¿en un navegador?” es True:

Ejercicio · Fácil · Python

Informa de qué Python se está ejecutando

Escribe una función describe_runtime() que le diga a un programa qué Python lo está ejecutando. No recibe argumentos y devuelve un diccionario con exactamente tres claves:

  • "implementation": el nombre de la implementación en minúsculas, como "cpython" (de sys.implementation.name);
  • "major_minor": la versión de funcionalidades como texto, como "3.14", construida con los números de sys.version_info;
  • "in_browser": True cuando el programa se ejecuta en un navegador web y False en caso contrario. Pyodide, el Python del navegador, indica sys.platform como "emscripten".

En CPython 3.14.8, en una computadora portátil, devuelve:

{'implementation': 'cpython', 'major_minor': '3.14', 'in_browser': False}

Las pruebas de ejemplo importan tu función de describe.py, la llaman y comprueban cada una de las tres entradas. Cuando las ejecutas aquí, se ejecutan en tu navegador, así que in_browser debería ser True.

Código inicial · describe.py

import sys


def describe_runtime():
    """Return which Python runs this program: its implementation, feature release and whether it runs in a browser."""
    # Replace this line with your code.
    return {}
Las pruebas de ejemplo · test_describe.py
import sys

from describe import describe_runtime


def test_three_keys():
    """returns a dictionary with exactly the three keys"""
    result = describe_runtime()
    assert isinstance(result, dict)
    assert sorted(result) == ["implementation", "in_browser", "major_minor"]


def test_implementation():
    """names the implementation in lower case"""
    assert describe_runtime()["implementation"] == sys.implementation.name


def test_major_minor():
    """gives the feature release as text, such as 3.14"""
    expected = f"{sys.version_info.major}.{sys.version_info.minor}"
    assert describe_runtime()["major_minor"] == expected


def test_in_browser():
    """says whether the program runs in a browser, as True or False"""
    assert describe_runtime()["in_browser"] is (sys.platform == "emscripten")
Una pista

sys.version_info.major y sys.version_info.minor son números: únelos en un texto con una f-string como f"{major}.{minor}". Una comparación como sys.platform == "emscripten" ya es True o False, así que puede ser el valor de "in_browser" tal cual.

Las pruebas de ejemplo se ejecutan en este dispositivo, en tu navegador (Pyodide): no se envía nada a mysmartcopilot.com. La primera ejecución descarga Python (unos 13.5 MB), que se guarda para las siguientes. Una comprobación en tu navegador es una orientación para ti, no la prueba de que el código sea correcto con cualquier entrada.

Para terminar, una ronda de preguntas sobre la compilación, la caché, las versiones y las implementaciones. La de las cuatro que peor respondas es la que se pregunta primero, y cada respuesta se explica en cuanto la das:

Práctica que se adapta a ti

Practica esta lección

12 preguntas sobre 4 ideas de esta lección. Cada respuesta se explica al momento, y lo que aciertas se guarda en este navegador.

  1. Pregunta 1 de 12 Ejecutas python3 hello.py y la última línea del archivo tiene un error de sintaxis. ¿Cuándo lo informa Python?

    Elige una respuesta.

    Ver la respuesta: pregunta 1 de 12

    Respuesta: Antes de que se ejecute ninguna línea del archivo, mientras compila el archivo entero a bytecode

    CPython compila el archivo entero a bytecode antes de ejecutar nada, y un error de sintaxis detiene la compilación. Los errores que solo aparecen mientras el programa se ejecuta, como dividir entre cero, ocurren después, cuando se ejecuta su línea.

  2. Pregunta 2 de 12 ¿Qué imprime late_zero_division.py en la salida estándar antes de su traceback?

    ¿Qué imprime este programa? Elige una respuesta.

    print("Line 1 ran")
    print("Line 2 ran")
    print(10 / 0)
    Ver la respuesta: pregunta 2 de 12

    Respuesta: imprime

    Line 1 ran
    Line 2 ran

    Una división entre cero es un error en tiempo de ejecución. El archivo se compiló, las líneas 1 y 2 imprimieron, y la línea 3 detuvo el programa con un ZeroDivisionError, informado en la salida de error estándar.

  3. Pregunta 3 de 12 Un script de 300 líneas imprime la cabecera de un informe y después se detiene en la línea 280 con un NameError. Un compañero dice que Python debió de leer el archivo solo hasta la línea 280. ¿Qué es lo correcto?

    Elige una respuesta.

    Ver la respuesta: pregunta 3 de 12

    Respuesta: CPython compiló primero las 300 líneas; el NameError es un error en tiempo de ejecución, lanzado al ejecutarse la línea 280

    La cabecera del informe demuestra que el archivo se compiló: un error de gramática en cualquier parte lo habría detenido antes de cualquier salida. Los nombres se buscan cuando se ejecuta su línea, así que el nombre mal escrito de la línea 280 solo lanzó el NameError cuando la ejecución llegó ahí.

  4. Pregunta 4 de 12 ¿Qué guarda CPython en una carpeta __pycache__?

    Elige una respuesta.

    Ver la respuesta: pregunta 4 de 12

    Respuesta: El bytecode de los módulos que importa un programa, para que la siguiente ejecución no tenga que compilarlos

    El bytecode de los módulos importados se guarda en caché como archivos .pyc, con el nombre de la implementación y la versión que los escribieron (greeting.cpython-314.pyc). El archivo que ejecutas directamente se compila cada vez y no se guarda. La carpeta se puede borrar sin problema y no va en el control de versiones.

  5. Pregunta 5 de 12 greeting.py define greet(name), que devuelve "Hello, " + name + "!". ¿Qué imprime main.py cuando lo ejecutas?

    ¿Qué imprime este programa? Elige una respuesta.

    import greeting
    
    print(greeting.greet("Asha"))
    Ver la respuesta: pregunta 5 de 12

    Respuesta: imprime

    Hello, Asha!

    import greeting ejecuta greeting.py una vez, lo que define la función; después, main.py la invoca e imprime lo que devuelve, con el signo de exclamación que añade la función.

  6. Pregunta 6 de 12 Un compañero sube las carpetas __pycache__ al repositorio del proyecto “para que el programa vaya más rápido”. ¿Qué le dices?

    Elige una respuesta.

    Ver la respuesta: pregunta 6 de 12

    Respuesta: El bytecode en caché solo ahorra la compilación al importar; el programa no se ejecuta más rápido, y las carpetas no van en el control de versiones

    La caché ahorra el tiempo que se tarda en compilar un módulo, una vez por cada cambio. Un programa no se ejecuta más rápido desde un archivo .pyc que desde su archivo .py; solo se carga más rápido. CPython reconstruye la carpeta cuando la necesita, así que añade __pycache__/ a .gitignore.

  7. Pregunta 7 de 12 ¿Cuál de estas versiones es una versión de funcionalidades?

    Elige una respuesta.

    Ver la respuesta: pregunta 7 de 12

    Respuesta: 3.15

    Las versiones se numeran 3.menor.micro. Un número menor nuevo, como 3.15, es una versión de funcionalidades, más o menos una al año; un número micro nuevo, como 3.14.8, es una versión de corrección de errores.

  8. Pregunta 8 de 12 Encuentras una respuesta antigua en internet. ¿Cuáles de estas líneas indican que se escribió para Python 2?

    Elige todas las respuestas correctas.

    Ver la respuesta: pregunta 8 de 12

    Respuesta:

    • for i in xrange(10)
    • name = raw_input("Name: ")
    • print "Hello"

    print sin paréntesis, raw_input() y xrange() son de Python 2. Python 2 ya no recibe correcciones, y su código falla en Python 3, como muestra python2_print.py.

  9. Pregunta 9 de 12 Un servidor todavía ejecuta una versión de funcionalidades de Python que salió hace seis años. ¿En qué estado está y qué debería hacerse?

    Elige una respuesta.

    Ver la respuesta: pregunta 9 de 12

    Respuesta: Ha pasado su fin de vida, así que no recibe ninguna corrección, tampoco de seguridad; hay que pasar a una versión de funcionalidades con soporte

    Una versión de funcionalidades recibe unos dos años de versiones de corrección de errores y después correcciones de seguridad hasta cinco años después de su salida. Seis años después, no recibe nada: planifica el cambio a una versión con soporte antes de que termine el soporte, no después.

  10. Pregunta 10 de 12 ¿Cuáles de estas son implementaciones del lenguaje Python, programas que ejecutan código Python?

    Elige todas las respuestas correctas.

    Ver la respuesta: pregunta 10 de 12

    Respuesta:

    • Pyodide
    • PyPy
    • CPython

    CPython es la implementación de referencia de python.org, PyPy añade un compilador just-in-time y Pyodide es CPython compilado a WebAssembly. pip es una herramienta que instala paquetes, y __pycache__ es una carpeta de bytecode en caché.

  11. Pregunta 11 de 12 Este programa se ejecuta en tu navegador, en Pyodide. ¿Qué imprime?

    Lee el código y elige una respuesta.

    import sys
    print(sys.platform == "emscripten")
    Ver la respuesta: pregunta 11 de 12

    Respuesta: True

    Pyodide es CPython compilado con Emscripten para WebAssembly, así que allí sys.platform es "emscripten", y la comparación es True. En una computadora, CPython indica en su lugar el sistema operativo, como "darwin" en macOS.

  12. Pregunta 12 de 12 Un programa debería imprimir un informe más corto cuando se ejecuta en el ejecutor del navegador. ¿Qué comprobación le dice dónde se ejecuta?

    Elige una respuesta.

    Ver la respuesta: pregunta 12 de 12

    Respuesta: sys.platform == "emscripten"

    La implementación es CPython en los dos sitios; lo que cambia es la plataforma. sys.platform es "emscripten" en el navegador y da el nombre del sistema operativo en una computadora.

Preguntas de entrevista

Calentamiento (júnior): ¿Python es un lenguaje compilado o interpretado?

Ninguna de las dos palabras describe el lenguaje en sí: compilar e interpretar es lo que hace una implementación, y CPython hace las dos cosas. Cuando ejecutas un archivo, primero compila el archivo entero a bytecode, instrucciones para su propia máquina virtual; por eso un error de sintaxis en la última línea detiene el archivo antes de su primera línea. Después, la máquina virtual interpreta ese bytecode, una instrucción cada vez, y ahí es donde aparecen los errores en tiempo de ejecución, como una división entre cero. El bytecode de los módulos importados se guarda en caché en __pycache__, así que las ejecuciones siguientes no tienen que compilarlos, pero nada se convierte en código máquina por adelantado, como haría un compilador de C. Otras implementaciones son distintas: PyPy añade un compilador just-in-time que convierte en código máquina el código que más se ejecuta, mientras el programa se ejecuta.

Dos preguntas más difíciles parten de esta lección: un bytecode que sobrevivió a una corrección, y una versión de Python cuyo soporte ha terminado. Piensa tu primer paso antes de abrir cada una:

Las respuestas modelo se abren con cualquier pase: 79 ₹ por 1 semana (2,99 US$), un solo pago que nunca se renueva.

  1. De nivel medio a sénior

    Se desplegó una corrección de un solo carácter en pricing.py, pero el servicio se comporta como el código antiguo hasta que alguien borra __pycache__. El despliegue escribe todos los archivos con una misma fecha de modificación fija, para tener compilaciones reproducibles, y conserva __pycache__ en un volumen entre despliegues. Explica qué pasó y cómo harías que no pudiera volver a pasar.

    Respuesta modelo, Pro. Las respuestas modelo se abren con cualquier pase; los precios están en el aviso de esta página. Primer paso y preguntas de seguimiento (en inglés)

  2. De júnior a nivel medio

    Un servicio todavía funciona en una versión de funcionalidades de Python que llegó a su fin de vida el mes pasado, y todo funciona. Tu jefe pregunta si la actualización puede esperar otro año. ¿Qué respondes y cómo planificarías el cambio a una versión con soporte?

    Respuesta modelo, Pro. Primer paso y preguntas de seguimiento (en inglés)

Para recordar

  • Ejecutar un archivo .py lo compila a bytecode y después ejecuta el bytecode en la máquina virtual de CPython; un error de sintaxis detiene el archivo antes de que se ejecute nada.
  • Los módulos importados guardan su bytecode en __pycache__; los archivos se pueden borrar sin problema y no van en el control de versiones. CPython vuelve a compilar un módulo cuando ha cambiado la fecha de modificación o el tamaño de su código fuente.
  • Las versiones de funcionalidades llegan más o menos una vez al año y tienen soporte durante unos cinco años; las versiones de corrección de errores no cambian funcionalidades. Este curso usa Python 3.14.
  • CPython es la implementación de referencia; PyPy, MicroPython y Pyodide ejecutan el mismo lenguaje en otros lugares.

Tarjetas · 4 tarjetas

Repaso rápido

Di la respuesta para ti antes de mirarla: recordarla es lo que hace que se quede.

  1. ¿Qué hace CPython con un archivo .py antes de ejecutar ninguna de sus líneas?

    Compila el archivo entero a bytecode para su máquina virtual. Un error de sintaxis en cualquier parte del archivo lo detiene en este paso, antes de que se ejecute nada.

  2. ¿Dónde guarda CPython el bytecode de un módulo que importas?

    En una carpeta __pycache__ junto al módulo, en un archivo como greeting.cpython-314.pyc. El script que ejecutas directamente no se guarda en caché.

  3. ¿Cuánto tiempo tiene soporte una versión de funcionalidades de Python?

    Unos dos años de versiones de corrección de errores y después solo correcciones de seguridad, hasta unos cinco años después de su primera versión.

  4. ¿Qué es Pyodide?

    CPython compilado a WebAssembly, para que Python pueda ejecutarse dentro de un navegador web, en tu propio dispositivo.

Referencias

Herramientas relacionadas

Informar de un problema con esta lección (en inglés)

Respuestas rápidas y búsqueda de herramientas

Escribe para buscar herramientas o para obtener una respuesta rápida (en inglés), por ejemplo 18% of 2500. Usa las flechas arriba y abajo para recorrer los resultados, Intro para elegir y Escape para cerrar.