Гид по технологиям

Запуск JavaScript из Python с помощью Js2Py

7 min read Программирование Обновлено 03 Jan 2026
Запуск JavaScript из Python с Js2Py
Запуск JavaScript из Python с Js2Py

Книга с красной обложкой с надписью «Javascript for Web Designers»

Короткое введение

JavaScript и Python — два самых популярных языка программирования. JavaScript традиционно используется в браузере и на сервере (Node.js) для интерфейсной и серверной логики. Python чаще применяют для бэкенда, аналитики и быстрого прототипирования. Иногда удобно запускать JavaScript из Python: это позволяет переиспользовать существующий JS-код, интегрировать библиотеки или выполнять скрипты, не переписывая их сразу на Python.

В этой статье мы рассмотрим модуль Js2Py — переводчик и интерпретатор JavaScript на чистом Python. Покажем практические примеры, разберём ограничения и предложим альтернативы и проверки для надёжной интеграции.

Основные понятия (1‑строчное определение)

  • JavaScript: язык сценариев для веба и серверной логики, исполнение обычно происходит интерпретатором в реальном времени.
  • Python: высокоуровневый язык общего назначения с динамической типизацией и сборщиком мусора.
  • Js2Py: библиотека на Python, которая переводит и выполняет JavaScript-код внутри Python-процесса.

Синтаксис JavaScript — кратко

  • Блоки кода: фигурные скобки { }.
  • Переменные: var, let, const.
  • Операторы: &&, ||, !. Равенство: == (по значению) и === (по значению и типу).
  • Ввод/вывод: window.prompt(), console.log().

Если вы хотите работать с фронтендом или полным стеком, знание JS обязательно.

Синтаксис Python — кратко

  • Блоки кода: отступы.
  • Переменные: имя = значение.
  • Константа: по соглашению — ИМЯ_ЗАГЛАВНЫМИ.
  • Операторы: and, or, not. Равенство: ==.
  • Ввод/вывод: input(), print().

Python прост для старта и широко применим в бэкенде и анализе данных.

Что такое Js2Py?

Js2Py — это переводчик и интерпретатор JavaScript, написанный на 100% Python. Он может автоматически переводить валидный JavaScript (ECMAScript 5.1 и часть ECMAScript 6) в Python и выполнять его внутри Python-процесса, не требуя внешних зависимостей.

Установка:

pip install js2py

Из документации проекта на GitHub отмечены явные ограничения (перечислено в исходнике):

  1. Js2Py игнорирует strict mode.
  2. Оператор with не поддерживается.
  3. Косвенный вызов eval трактуется как прямой.

Дополнительно: код, который зависит от браузерных API (DOM, window, document) или от асинхронных браузерных встроенных механизмов, обычно не будет работать как есть. Асинхронные абстракции (Promises, async/await) либо не поддерживаются напрямую, либо требуют обёрток/переписывания.

Примеры: запуск JS в Python

Ниже — практические примеры. Все примеры можно запускать в локальной среде после установки js2py.

Hello World

import js2py
js2py.eval_js('console.log("Hello World!")')

Код импортирует модуль и выполняет переданный JS-скрипт. Внутреннее сопоставление console.log обычно печатает в stdout Python-процесса.

Запуск программы Hello World в js2py (вывод в терминал)

Функция сложения

import js2py
js_add = '''function add(a, b){
  return a + b;
}'''
add = js2py.eval_js(js_add)
print(add(3, 7))

Здесь мы определяем JS-функцию, переводим её с помощью eval_js и затем вызываем как Python-объект. Типы аргументов и возвращаемые значения автоматически конвертируются между JS и Python, где это возможно.

Результат сложения двух чисел через js2py

Перевод целого файла JavaScript в Python

Пусть файл example.js содержит:

// Object
function Rectangle(w, h) {
    this.w = w;
    this.h = h
}

Rectangle.prototype = {
    getArea: function () {
        return this.w * this.h
    }
};

x = new Rectangle(10, 5)

Есть два способа работать с ним из Python:

  1. Запустить файл без явного перевода:
import js2py
eval_result, example = js2py.run_file('example.js')

run_file возвращает результат выполнения и объект окружения, через который можно обращаться к определённым сущностям.

  1. Перевести и сохранить как Python-файл:
import js2py
js2py.translate_file('example.js', 'example.py')

Первый метод удобен для интеграции и тестирования. Второй — если нужно получить автономный Python-код.

Создание объектов из JS-файла

В Js2Py синтаксис создания новых экземпляров немного отличается. Вместо new Func(args) используется .new(args):

import js2py
eval_result, example = js2py.run_file('example.js')
rect = example.Rectangle.new(8, 2)
print(rect.getArea())

Так мы получаем объект Rectangle и вызываем его методы из Python.

Результат вычисления площади прямоугольника через js2py

Типичные проблемы и когда это не работает

  • Браузерный код: вызовы DOM, window, document, localStorage не существуют в среде Js2Py без эмуляции.
  • Асинхронность: Promise и async/await либо не поддерживаются, либо требуют переписывания в синхронные формы.
  • Сложные нативные расширения: модули Node.js, нативные бинарные аддоны не будут работать.
  • Современные фичи ES* не покрыты полностью — может понадобиться транспиляция до ES5.

Совет: если ваш код зависит от браузера или Node.js API, лучше использовать альтернативы (ниже) или внедрять слой адаптации.

Альтернативы и когда их выбрать

  • Использовать Node.js и запускать процессы из Python (subprocess). Подходит, если нужна точная совместимость с Node API.
  • Pyodide/Brython/Transcrypt: запускать Python в браузере или транслировать Python в JS для фронтенда.
  • HTTP/IPC: держать JS-сервис отдельно и взаимодействовать через JSON/REST/gRPC.
  • V8/PyMiniRacer: встраивание движка V8 для исполнения JS в Python с большей совместимостью.

Краткая подсказка по выбору: если нужен полный доступ к Node/браузерным API — используйте Node.js; если нужно быстро вызвать небольшой скрипт — Js2Py удобно; для производительности и точности совместимости — используйте V8-обёртки.

Ментальные модели и эвристики

  • Перевод против исполнения: translate_file даёт код для чтения, run_file исполняет «как есть». Выберите translate, если хотите анализировать/отлаживать JS-код в Python.
  • Минимизируйте зависимости: лучше инкапсулировать JS-логику в чистых функциях без доступа к глобальным объектам.
  • Однонаправленный интерфейс: держите интерфейс между Python и JS простым (числа, строки, объекты в JSON-совместимом виде).

Чек-листы по ролям

Разработчик:

  • Проверил, какие API использует JS-код (DOM, Node, асинхронность).
  • Разбил код на чистые функции с явными входами/выходами.
  • Написал тесты для критичных функций после перевода.

Ревьюер/инженер качества:

  • Проверил соответствие результатов между нативным JS и выполнением в Js2Py.
  • Оценил производительность и память при типичных нагрузках.
  • Убедился в обработке ошибок и исключений.

Операции/DevOps:

  • Обеспечил установку нужной версии Python и pip-зависимостей.
  • Настроил логирование stdout/stderr и мониторинг процессов.

Критерии приёмки

  • Код из example.js корректно выполняет все тесты при запуске через js2py.run_file.
  • Основные функции возвращают ожидаемые типы и значения.
  • Логи и ошибки читаемы и сопоставимы с оригинальным исполнением JS.
  • Производительность в допустимых пределах для вашего приложения.

Шпаргалка и полезные сниппеты

  • Выполнить строку JS и получить результат:
result = js2py.eval_js('1 + 2')
print(result)  # 3
  • Получить функцию из JS и вызвать её:
add = js2py.eval_js('function (a,b){ return a+b; }')
print(add(10,20))
  • Запустить JS-файл и получить окружение:
eval_result, env = js2py.run_file('script.js')
# env содержит переменные и функции из файла
  • Перевести файл:
js2py.translate_file('app.js', 'app.py')
  • Ловушка исключений:
try:
    js2py.eval_js('throw new Error("oops")')
except Exception as e:
    print('JS error in Python:', e)

Матрица совместимости и заметки о версиях

  • Поддержка синтаксиса: ECMAScript 5.1 — полная; ECMAScript 6 — частичная (функции/конструкции могут быть частично реализованы).
  • Браузерные API: отсутствуют по умолчанию.
  • Node.js-специфичные модули: не поддерживаются без эмуляции.

Если ваш проект активно использует современные ES-фичи, рекомендуется либо предварительно транспилировать код (Babel → ES5), либо использовать V8-обёртку для Python.

Безопасность и приватность

  • Выполнение незнакомого JS-кода внутри процесса Python представляет риск. Не выполняйте код из ненадёжных источников.
  • Логи вывода могут содержать чувствительные данные. Фильтруйте и обрабатывайте данные перед записью в логи.
  • Если система обрабатывает данные граждан или персональные данные, проверьте соответствие требованиям конфиденциальности (GDPR) и минимизируйте передачу данных между средами.

Пример подхода для интеграции (мини-методология)

  1. Инвентаризация: проанализируйте, какие JS-файлы и API используются.
  2. Изоляция: выделите чистые функции и модули без зависимости от окружения.
  3. Тесты: напишите тесты на оригинальном JS и на выполнении через Js2Py.
  4. Производительность: профилируйте и оцените нагрузку.
  5. Релиз: задокументируйте ограничения и добавьте мониторинг.

Простая диаграмма принятия решения

flowchart TD
  A[Нужно запускать JS из Python?] --> B{JS зависит от браузера или Node API?}
  B -- Да --> C[Запустить отдельный Node.js процесс или сервис]
  B -- Нет --> D{Короткие скрипты/функции?}
  D -- Да --> E[Использовать Js2Py 'eval/run/translate']
  D -- Нет --> F[Рассмотреть V8-обёртки или перевод с транспиляцией]

Краткий глоссарий (1 строка)

  • eval_js: функция Js2Py для оценки строки JS и возвращения результата.
  • run_file: запускает JS-файл и возвращает окружение.
  • translate_file: переводит JS-файл в Python-код.

Когда стоит переводить, а когда — обёртывать в сервис

  • Переводите и запускайте внутри Python, если логика самодостаточна и не зависит от браузера.
  • Используйте сервис/процесс, если нужно точное поведение Node.js, доступ к файловым/сетевым Node API или асинхронная обработка.

Краткое резюме

Js2Py — удобный инструмент для запуска и перевода JavaScript в среде Python. Он хорош для быстрых интеграций и реиспользования небольших библиотек. Однако для браузерного кода, Node.js-специфичных модулей или интенсивной асинхронной логики лучше выбирать альтернативные подходы. Всегда проверяйте ограничения, пишите тесты и оценивайте безопасность при исполнении внешнего кода.

Важно: перед развёртыванием проведите тестирование совместимости и нагрузочное тестирование в условиях, близких к продакшену.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

SpyLoan: мошеннические Android‑приложения
Безопасность

SpyLoan: мошеннические Android‑приложения

CSS text-shadow — 11 примеров стильного текста
CSS

CSS text-shadow — 11 примеров стильного текста

WRAPROWS в Excel: руководство и примеры
Excel

WRAPROWS в Excel: руководство и примеры

TastyIgniter на Raspberry Pi — установка и настройка
Ресторанное ПО

TastyIgniter на Raspberry Pi — установка и настройка

Google Keep в Chrome: установка и быстрое руководство
Продуктивность

Google Keep в Chrome: установка и быстрое руководство

История версий в Google Keep — как найти и восстановить
Продуктивность

История версий в Google Keep — как найти и восстановить