Aunque Python y JavaScript son lenguajes muy distintos en su propósito y ecosistema, no es raro encontrarnos en situaciones en las que necesitamos integrar ambos. Tal vez queremos reutilizar una función compleja escrita en JavaScript, o simplemente acceder a una librería que no existe (o no está tan madura) en el ecosistema Python. En esos casos, poder ejecutar código JavaScript desde Python se vuelve una opción más que interesante.
Por ejemplo, algunas situaciones comunes en las que esto puede ser útil son:
A lo largo de esta guía veremos cómo ejecutar código JavaScript (y también TypeScript) desde Python, usando principalmente la herramienta js2py, aunque también mencionaremos otras opciones. Veremos casos básicos y avanzados, así como buenas prácticas para que tu integración sea mantenible y eficiente.
Tabla de contenidos
Actualmente existen varias opciones para ejecutar JavaScript desde Python. Algunas se apoyan en motores JavaScript integrados como el de Node.js o V8, y otras implementan su propio intérprete. En esta sección, te presentamos las principales alternativas, con sus ventajas y limitaciones.
js2py – Intérprete puro en Pythonjs2py es una biblioteca que traduce código JavaScript a Python (en tiempo de ejecución), permitiendo su ejecución directa sin depender de un motor externo como Node.js.
Ventajas:
pip, sin dependencias externas..js.Limitaciones:
window, document, fetch, etc.js2py es la solución ideal para la integración de funciones puramente lógicas o matemáticas.
PyMiniRacer – Motor V8PyMiniRacer incluye el motor V8 de Google, permitiendo ejecutar código JavaScript moderno con alto rendimiento.
Ventajas:
Limitaciones:
**PyMiniRacer ** es la opción más adecuada si necesitas ejecutar JavaScript moderno pero sin depender del entorno web.
subprocess + node – Ejecutar JS usando Node.jsSi ya tienes Node.js instalado, puedes ejecutar cualquier archivo JS usando subprocess desde Python.
import subprocess result = subprocess.run(['node', 'script.js'], capture_output=True, text=True) print(result.stdout)
Ventajas:
Limitaciones:
El uso de subprocess y node es la opción más flexible, pero también la más “manual” de todas.
PyExecJS – Ejecutar código JS con múltiples motoresPyExecJS permite ejecutar código JS usando distintos motores de JavaScript: Node.js, JScript, PhantomJS, etc.
Ventajas:
Limitaciones:
PyExecJS es similar a subprocess y node, pero con menos requiere de menos configuraciones “manuales”.
En la siguiente tabla se muestra una comparativa entes estas cuatro opciones que se han visto para ejecutar JavaScript desde Python.
| Opción | Fácil de usar | Soporte ES6+ | Integración | Requiere Node |
|---|---|---|---|---|
js2py | ✅ Muy fácil | ❌ No | ✅ Alta | ❌ No |
PyMiniRacer | ⚠ Media | ✅ Sí | ⚠ Limitada | ❌ No |
subprocess | ✅ Fácil | ✅ Total | ⚠ Manual | ✅ Sí |
PyExecJS | ✅ Fácil | ✅ Parcial | ⚠ Limitada | ✅ Sí |
En esta entrada, nos centraremos en js2py porque es la opción más accesible para comenzar, ideal para scripts pequeños, funciones simples y prototipos.
js2py y primer ejemplo básicoLa mayor ventaja de js2py es que no necesita tener Node.js ni ningún motor JavaScript instalado. Solo necesitas tener Python 3.6 o superior.
Puedes instalar js2py directamente desde PyPI con:
pip install js2py
Vamos a comenzar con algo sencillo: ejecutar una función JavaScript que suma dos números. Por ejemplo, la siguiente función:
function suma(a, b) {
return a + b;
} Para ejecutar esta función de suma, solamente se tiene que importar js2py, crear una variable de Python con la función, crear un contexto de js2py, inyectar la función en este contexto y llamar a la función desde Python con los parámetros para que se ejecute. Lo que se puede ver en el siguiente código:
import js2py
# Código JavaScript como string
codigo_js = """
function suma(a, b) {
return a + b;
}
"""
# Ejecutamos el código JS y creamos un contexto
contexto = js2py.EvalJs()
contexto.execute(codigo_js)
# Ahora podemos usar la función suma como si fuera una función Python
resultado = contexto.suma(5, 7)
print(f"Resultado: {resultado}") Respecto al uso de js2py para ejecutar código JavaScript es importante notar los siguientes puntos:
int, float, str) se convierten automáticamente entre Python y JS. Los objetos complejos pueden necesitar conversión manual.js2py lanzará una excepción de tipo JsException..jsEn vez de escribir el código JavaScript como un string dentro de Python, también puedes cargarlo desde un archivo externo. Facilitando la reutlización del código ya existente. Ademas esto mantiene tu código más limpio y organizado.
A modo de ejemplo, vamos a generar un llamado utilidades.js con el código JavaScript que se dese ejecutar:
function cuadrado(x) {
return x * x;
}
function saludar(nombre) {
return "Hola, " + nombre + "!";
} Una vez creado al archivo, solo hay que importar el archivo en una variable y repetir el procesos visto anteriormente: crear el contexto, inyectar el código y llamar a las funciones desde Python. Una forma de hacer esto seria como se muestra en el siguiente ejemplo:
import js2py
# Leer el contenido del archivo .js
with open('utilidades.js', 'r', encoding='utf-8') as f:
codigo_js = f.read()
# Crear un contexto JS y ejecutar el código
contexto = js2py.EvalJs()
contexto.execute(codigo_js)
# Llamar funciones definidas en el JS
print(contexto.cuadrado(9))
print(contexto.saludar("Lucía")) .jsEl código JavaScript no tiene porque estar en un único archivo, lo que mejora la mantenibilidad y escalabidliad de esta solución. En estos casos es importante tener en cuenta los siguiente puntos:
import o require), js2py no los soporta, porque no tiene un sistema de módulos como Node.js.Debido a que js2py no entiende TypeScript directamente, pero sí puedes usar TypeScript si lo transpilas primero a JavaScript. A continuación, te mostramos cómo hacerlo.
Para esto es necesario tener tener Node.js y TypeScript instalado como dependencia global. Si no lo tienens puedes usar la siguiente linea para instarlo:
npm install -g typescript
logica.tsAhora, solamente hay que disponer de un archivo con una o varias funciones escritas en TypeScript. Por ejemplo, el siguiente archivo con la función doble:
export function doble(x: number): number {
return x * 2;
} Es importante recordar que js2py no soporta export ni el sistema de módulos de ES6, así que deberás transpilar y adaptar el resultado. Esto es, compilar para ES5 como se muestra a continuación:
tsc logica.ts --target ES5 --module none
Esto generará un archivo logica.js con código JavaScript similar al que se muestra a continuacion:
function doble(x) {
return x * 2;
} Ahora, que se tiene un archivo JavaScript con el código traspalado, simplemente se debe ejecutar como se ha hecho en las secciones anteriores.
import js2py
with open('logica.js', 'r', encoding='utf-8') as f:
codigo_js = f.read()
contexto = js2py.EvalJs()
contexto.execute(codigo_js)
print(contexto.doble(21)) # 42 Aunque js2py permite una integración muy directa, es importante mantener cierto orden y estructura para evitar errores difíciles de depurar, especialmente si el proyecto crece. Aquí te comparto una serie de buenas prácticas a la hora de usar esta libreria:
Evita incrustar cadenas JS largas dentro de tu código Python. En su lugar:
.js separados.with open() para cargarlos.with open("mi_script.js") as f:
js_code = f.read() js2py solo es compatible con ECMAScript 5.1. Por tanto, evita:
import / exportclass, let, constPromise, async/await() => {})No es necesario hacer esto de manera manual, puedes convertir tu código a ES5 con herramientas como Babel o el compilador de TypeScript (tsc).
try/exceptSi el código JavaScript falla, js2py lanza una excepción JsException:
import js2py
try:
ctx = js2py.EvalJs()
ctx.execute("function error() { throw '¡error!'; } error();")
except js2py.internals.simplex.JsException as e:
print("Se produjo un error en JavaScript:", e) Esto facilita trabajar con los datos y evita errores sutiles:
resultado = ctx.getDatos() # Objeto JavaScript datos = resultado.to_dict() # Diccionario Python
Cuando tu código JavaScript implemente funciones que serán usadas desde Python, asegúrate de:
run, calc, doStuff.Esto previene errores si otro desarrollador (o tú mismo en el futuro) retoma el código.
Si usas TypeScript o ES6, puedes usar tsc o babel para convertir automáticamente el código a ES5 compatible. Ejemplo con TypeScript:
tsc archivo.ts --target ES5 --module none --outDir js_build
Luego desde Python:
with open("js_build/archivo.js") as f:
js_code = f.read() Ejecutar código JavaScript desde Python es una recuso que ofrece múltiples posibilidades, pero debe usarse con cabeza. No es una solución mágica, sino una herramienta extremadamente útil para casos concretos.
Promise, fetch, async/await.Para casos sencillos y controlados, js2py es una opción liviana y efectiva que te permite aprovechar código JavaScript desde Python de forma integrada. Para casos más complejos, será necesario usar Node.js como servicio auxiliar (ejecutado desde subprocess) lo que te dará mayor flexibilidad y escalabilidad.
Nota: La imagen de este artículo fue generada utilizando un modelo de inteligencia artificial.
js2py con Python 3.10Dado que js2py no es compatible con Python 3.11 o 3.12, la solución más segura es crear un entorno virtual con una versión de Python soportada (por ejemplo, Python 3.10). Esto te permite instalar y usar js2py sin afectar el resto de tus proyectos o tu sistema.
pip, conda o poetry.venv con Python 3.10python3.10 -m venv js2py-env
source js2py-env/bin/activate
js2py-env\Scripts\activate
js2py:pip install js2py
js2py sin errores.conda (más fácil si usas Anaconda/Miniconda)Si trabajas con Anaconda o Miniconda, puedes crear un entorno con Python 3.10 fácilmente:
conda create -n js2py-env python=3.10 conda activate js2py-env pip install js2py
“El interés compuesto es la octava maravilla del mundo. El que lo entiende lo gana…
Tienes los datos de ventas de tres productos en dos años distintos y quieres saber…
Imagina la situación. Tu equipo lleva tres años con un modelo en producción. No es…
Cuando un banco evalúa una solicitud de crédito necesita responder a una pregunta aparentemente simple:…
En el octavo aniversario de Analytics Lane seguimos ampliando nuestro laboratorio de aplicaciones interactivas y,…
Hoy, 2 de mayo de 2026, Analytics Lane cumple exactamente ocho años. Todo empezó con…
This website uses cookies.