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

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

• 8 min read • Программирование • Обновлено 05 Dec 2025
Запуск JavaScript из Python с Js2Py
Запуск JavaScript из Python с Js2Py

TL;DR

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

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

Введение

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

В этой статье вы найдёте:

  • понятное объяснение синтаксиса JavaScript и Python;
  • установку и основные команды Js2Py;
  • рабочие примеры: Hello World, функция сложения, конвертация файлов и работа с объектами;
  • ограничения и когда подход не подойдёт;
  • альтернативы, чек-листы, шаги интеграции и рекомендации по безопасности;
  • короткий глоссарий и критерии приёмки.

Важно: материал ориентирован на практическое применение и содержит уточнения по совместимости и возможным подводным камням.

Зачем запускать JavaScript из Python

Коротко: есть сценарии, когда хочется повторно использовать существующую JS‑логику в Python‑проекте или интегрировать библиотеки, написанные на JS, без полной переписывания. Примеры:

  • у вас есть готовая бизнес‑логика на JavaScript, и вы хотите временно использовать её в Python‑сервисе;
  • нужно быстро протестировать небольшие фрагменты JS в окружении Python;
  • вы хотите автоматизировать взаимодействие с JS‑библиотеками на этапе серверной обработки;
  • образовательные цели и эксперименты.

Если же задача подразумевает высокую производительность, многопоточность или тесную интеграцию с веб‑браузером — чаще подходят другие подходы, описанные ниже.

Краткое сравнение синтаксиса JavaScript и Python

Ниже — сжатая шпаргалка по синтаксису, полезная при переводе кода между языками.

JavaScript — ключевые моменты

  • исполнение: интерпретируемый язык, часто выполняется в браузере или в Node.js;
  • блоки кода: фигурные скобки { } обозначают области видимости;
  • объявление переменных: var, let, const; пример: const pi = 3.14;
  • функции: function name(args) { … } и стрелочные функции (args) => expr;
  • операторы сравнения: == (сравнение по значению), === (строгое сравнение по типу и значению);
  • логические операторы: &&, ||, !;
  • ввод/вывод в браузере: window.prompt(), console.log();

Определение: интерпретируемый язык — код выполняется без отдельной стадии компиляции в машинный код.

Python — ключевые моменты

  • исполнение: интерпретируемый язык с динамической типизацией;
  • блоки кода: отступы (обычно 4 пробела) определяют блоки;
  • объявление переменных: переменные присваиваются напрямую, пример: total = 42;
  • константы: соглашение — имена в верхнем регистре, пример: MAX_SIZE;
  • операторы сравнения: == сравнивает значение; проверка типов через type() или isinstance();
  • логические операторы: and, or, not;
  • ввод/вывод: input(), print();

Определение: динамическая типизация — тип переменной определяется во время выполнения, а не при компиляции.

Что такое Js2Py

Js2Py — это реализация интерпретатора JavaScript, написанная на чистом Python. Библиотека переводит JS в эквивалентный Python‑код и может интерпретировать многие конструкции ECMAScript 5.1 и частично ES6.

Установка

pip install js2py

Ключевые характеристики:

  • полностью на Python, без внешних зависимостей;
  • умеет исполнять выражения и функции из JavaScript;
  • поддерживает вызов JS‑функций как обычных Python‑объектов;
  • имеет ограничения по некоторым конструкциям языка (описано ниже).

Ограничения Js2Py

  • игнорируется ‘strict mode’;
  • оператор with не поддерживается;
  • косвенные вызовы eval обрабатываются как прямые;

Эти ограничения означают, что не весь современный JavaScript будет переводиться корректно — особенно код, который зависит от особенностей окружения браузера или от динамической семантики некоторых ES6+ конструкций.

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

Практические примеры

Ниже приведены рабочие фрагменты, которые можно запускать в Python‑интерпретаторе после установки js2py.

1. Программа Hello World

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

Пояснение: eval_js принимает строку с JavaScript и выполняет её. В данном случае текст выводится в стандартный вывод Python через реализацию console.log внутри Js2Py.

Выполнение программы Hello World в окружении JS и Python

2. Функция сложения двух чисел

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

Пояснение: функция объявляется на JavaScript, затем eval_js возвращает ссылку на функцию, которую можно вызвать как обычный Python‑объект.

Выполнение функции сложения в Js2Py

3. Конвертация целого файла 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);

Есть два подхода:

  • запуск JS‑файла в Python без явной генерации .py;
import js2py
eval_result, example = js2py.run_file('example.js')

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

  • явная транcляция файла в Python и его сохранение:
import js2py
js2py.translate_file('example.js', 'example.py')

translate_file генерирует Python‑файл, эквивалентный исходному JS, который затем можно импортировать или запускать отдельно.

4. Создание объекта через new

В отличие от привычного синтаксиса new example.Rectangle(8,2), в Js2Py нужно использовать .new(8,2):

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

Вычисление площади прямоугольника через Js2Py

Пояснение: возвращаемый объект имеет методы, соответствующие prototype в JavaScript.

Когда подход не подойдёт — типичные ограничения и кейсы

  • код, завязанный на DOM или API браузера (document, window, fetch) прямо не выполнится без эмуляции;
  • современные ES6+ возможности (например, некоторые встроенные типы, синтаксические сахар) могут работать частично;
  • узкоспециализированные нативные расширения Node.js (модули на C/C++ или специфичные APIs) не будут доступны;
  • критичные по производительности участки: интерпретация через Js2Py обычно медленнее нативного Node.js или чистого Python.

Контрпример: код, активно использующий промисы и асинхронные API браузера, скорее всего потребует переработки под синхронную модель или полную миграцию на Node.js.

Альтернативные подходы

  • запуск Node.js как отдельного процесса и взаимодействие через stdin/stdout, сокеты или HTTP;
  • использование PyV8 или других биндингов к движку V8 (если нужна производительность и поддержка современных стандартов);
  • транспиляция Python в JavaScript для фронтенда (Brython, Transcrypt, Pyodide) — обратный сценарий;
  • использовать WebAssembly для общей логики между языками.

Каждый подход имеет компромиссы: производительность, простота интеграции, поддержка стандартов.

Мини‑методология: как безопасно интегрировать Js2Py в проект

  1. Оцените код: убедитесь, что он не зависит от браузерных API и не использует неподдерживаемые конструкции.
  2. Напишите набор unit‑тестов на Python, которые проверят поведение функции до и после перевода.
  3. Воспользуйтесь run_file для быстрой интеграции и evaluate небольших фрагментов через eval_js.
  4. Если требуется постоянная интеграция, переведите файлы через translate_file и включите их в CI.
  5. Добавьте слой валидации входных данных и выполняйте код в ограниченном окружении.
  6. Мониторьте производительность и, при необходимости, переработайте горячие участки в нативный Python или Node.js.

Чек‑лист для ролей

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

  • проверить совместимость синтаксиса;
  • написать тесты до переноса;
  • использовать translate_file для долговременной интеграции;
  • убедиться в отсутствии выполнения непроверенного кода;

DevOps/инженер по интеграции:

  • обеспечить изоляцию выполнения (контейнеры, ограниченные права);
  • следить за зависимостями и версией Python;
  • настроить логирование и алёрты на падение парсинга/выполнения;

Тестировщик:

  • покрыть граничные случаи для числовых операций и работы с объектами;
  • проверить обработку ошибок и исключений в переводе;

Матрица совместимости — какие сценарии подходят

  • встраивание алгоритмов без браузерных API — хорошо;
  • перенос UI‑логики, завязанной на DOM — плохо;
  • использование нативных модулей Node.js — не поддерживается;
  • простые вычислительные функции и утилиты — часто подходят.

Как протестировать и критерии приёмки

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

  • все существующие unit‑тесты проходят с незначительной дельтой по точности;
  • функциональность, зависящая от численных расчётов, даёт идентичные или приемлемо близкие результаты;
  • производительность укладывается в допуски проектной спецификации;
  • отсутствуют регрессии при обработке пограничных и некорректных входных данных.

Тестовые сценарии:

  • сравнение результатов 1000 случайных входов между оригиналом JS и переводом в Python;
  • стресс‑тесты по времени выполнения для горячих путей;
  • тесты на обработку исключений и на получение текстов ошибок.

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

  • Не выполняйте непроверенный JS‑код из внешних источников. Js2Py исполняет код — это риск удалённого выполнения.
  • Изолируйте окружение: используйте контейнеры, лимиты памяти и CPU.
  • Логируйте вызовы и любые неожиданные исключения.
  • Если обрабатываете персональные данные, удостоверьтесь, что обработка соответствует требованиям локального законодательства о защите данных.

Советы по миграции и оптимизации

  • выносите тяжёлые вычисления в нативный код (Python или C) при необходимости;
  • используйте translate_file, если код должен стать частью долгосрочного проекта;
  • при интенсивном взаимодействии между Python и JS минимизируйте число вызовов между языками — каждый вызов имеет оверхед.

Mental models и эвристики

  • думайте о Js2Py как о прослойке: удобно для прототипов и повторного использования логики, но не всегда как о долгосрочном решении;
  • правило 80/20: если 80% логики можно портировать быстро, это оправдывает использование Js2Py;
  • если требуется 0‑латентность и масштабирование, рассмотрите нативные решения.

Примеры сниппетов и быстрый чек-лист для разработчика

  • установка: pip install js2py
  • выполнить строку JS: js2py.eval_js(“‘foo’ + ‘bar’”)
  • получить функцию из строки: f = js2py.eval_js(“(function(x){return x*x;})”); print(f(5))
  • запуск файла: result, env = js2py.run_file(‘script.js’)
  • перевод в файл: js2py.translate_file(‘script.js’, ‘script.py’)

Диаграмма принятия решения

flowchart TD
  A[Есть ли зависимость от DOM/Browser API?] -->|Да| B[Использовать Node.js или эмуляцию браузера]
  A -->|Нет| C[Код чисто вычислительный?]
  C -->|Да| D[Использовать Js2Py для быстрого запуска и тестирования]
  C -->|Нет| E[Рассмотреть транcляцию кода или переписывание]
  D --> F[Добавить тесты и CI]
  E --> F

Краткий глоссарий

  • Js2Py — библиотека для выполнения и перевода JavaScript в Python;
  • eval_js — функция для выполнения JavaScript из строки;
  • run_file — исполнение JavaScript‑файла с возвратом окружения;
  • translate_file — трансляция JS‑файла в Python‑исходник;

Итог и рекомендации

  • Js2Py — отличный инструмент для быстрых прототипов, тестирования и повторного использования чистой логики на JavaScript внутри Python‑приложений.
  • Для продакшена взвешивайте требования по производительности и безопасности.
  • При сомнениях проводите сравнительные тесты и рассматривайте альтернативы (Node.js, V8‑биндинги, WebAssembly).

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

  • Установите js2py и попробуйте eval_js для простых фрагментов.
  • Используйте run_file для интеграции файлов и translate_file для перевода в код, который можно версионировать.
  • Не забывайте про тесты, защиту от выполнения непроверенного кода и мониторинг производительности.

Ключевые контакты и дальнейшие шаги

  • Создайте небольшой PoC с 2–3 функциями из существующего JS‑кода;
  • Выполните сравнение результатов и нагрузочное тестирование;
  • Если PoC успешен, добавьте автоматическую трансляцию в CI и составьте план миграции или поддержки.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

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

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро