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

Введение
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.
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‑объект.
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())Пояснение: возвращаемый объект имеет методы, соответствующие 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 в проект
- Оцените код: убедитесь, что он не зависит от браузерных API и не использует неподдерживаемые конструкции.
- Напишите набор unit‑тестов на Python, которые проверят поведение функции до и после перевода.
- Воспользуйтесь run_file для быстрой интеграции и evaluate небольших фрагментов через eval_js.
- Если требуется постоянная интеграция, переведите файлы через translate_file и включите их в CI.
- Добавьте слой валидации входных данных и выполняйте код в ограниченном окружении.
- Мониторьте производительность и, при необходимости, переработайте горячие участки в нативный 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 и составьте план миграции или поддержки.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента