Лучший способ интегрировать Python и JavaScript?
Можно ли интегрировать Python и JavaScript? Например, представьте, что вы хотите иметь возможность определять классы в JavaScript и использовать их из Python (или наоборот). Если так, то как лучше? Мне интересно не только, возможно ли это, но и сделал ли это кто-либо в рамках "серьезного" проекта или продукта.
Я предполагаю, что было бы возможно использовать Jython и Rhino, например, но мне интересно, действительно ли кто-нибудь когда-либо делал это, и есть ли решения для других платформ (особенно CPython).
13 ответов
Вот кое-что, обертка Python вокруг интерпретатора SeaMonkey Javascript... http://pypi.python.org/pypi/python-spidermonkey
Как насчет pyjs?
С вышеуказанного сайта:
pyjs - это платформа для разработки многофункциональных интернет-приложений (RIA) для веб-приложений и настольных компьютеров. С pyjs вы можете писать свои веб-приложения на JavaScript полностью на Python.
Этот вопрос не совсем молодой, но есть несколько альтернатив:
- " Skulpt - это полностью реализованная в браузере реализация Python".
- Brython - "Реализация Python 3 для веб-программирования на стороне клиента"
- RapydScript - "Python-подобный JavaScript без лишних издержек или излишеств"
- Transcrypt - " Компонент Lean and Mean Python 3.6 to JavaScript с множественным наследованием, исходными картами, статической проверкой типов и выборочной перегрузкой операторов". (также на Github)
Есть два проекта, которые допускают "очевидный" переход между объектами python и объектами javascript, с "очевидными" переводами из int или float в Number и str или unicode в String: PyV8 и, как уже упоминал один автор: python-spidermonkey.
на самом деле существует две реализации pyv8 - первоначальный эксперимент был выполнен Себастьеном Луизелем, а второй (в активной разработке) - Флайером Лю.
Мой интерес к этим проектам заключался в том, чтобы связать их с пижамой, компилятором python-to-javascript, для создания ускорителя Python JIT.
так что там много всего - все зависит от того, что вы хотите сделать.
Если вы просто заинтересованы в совместном использовании сложных типов данных между javascript и python, ознакомьтесь с jsonpickle. Он включает в себя стандартные библиотеки Python JSON, но имеет некоторые умения в сериализации и десериализации классов Python и других типов данных.
Многие проекты Google App Engine использовали эту библиотеку. Joose и FirePython включают в себя jsonpickle.
Многие примеры устарели на годы и требуют сложной настройки. Вы можете попробовать JSPyBridge (полное раскрытие: я автор).
Это двунаправленный мост, который позволяет использовать код JavaScript из Python и наоборот. Это означает, что код Python может вызывать обратные вызовы JS, а код JS может вызывать обратные вызовы Python.
Доступ к Python из JS, пример numpy + matplotlib, с системой импорта ES6:
import { py, python } from 'pythonia'
const np = await python('numpy')
const plot = await python('matplotlib.pyplot')
// Fixing random state for reproducibility
await np.random.seed(19680801)
const [mu, sigma] = [100, 15]
// Inline expression evaluation for operator overloading
const x = await py`${mu} + ${sigma} * ${np.random.randn(10000)}`
// the histogram of the data
const [n, bins, patches] = await plot.hist$(x, 50, { density: true, facecolor: 'g', alpha: 0.75 })
console.log('Distribution', await n) // Always await for all Python access
await plot.show()
python.exit()
Через CommonJS (без ожидания верхнего уровня):
const { py, python } = require('pythonia')
async function main() {
const np = await python('numpy')
const plot = await python('matplotlib.pyplot')
...
// the rest of the code
}
main().then(() => python.exit()) // If you don't call this, the process won't quit by itself.
Доступ к JS из Python:
from javascript import require, globalThis
chalk, fs = require("chalk"), require("fs")
print("Hello", chalk.red("world!"), "it's", globalThis.Date().toLocaleString())
fs.writeFileSync("HelloWorld.txt", "hi!")
PyExecJS может использовать каждый из PyV8, Node, JavaScriptCore, SpiderMonkey, JScript.
>>> import execjs
>>> execjs.eval("'red yellow blue'.split(' ')")
['red', 'yellow', 'blue']
>>> execjs.get().name
'Node.js (V8)'
Используйте Js2Py для перевода JavaScript в Python, это единственный доступный инструмент:)
Вы также можете попробовать проект PyPy - у них есть компилятор Python to (что угодно), включая Python to Javascript, C и llvm. Это позволяет вам писать свой код на Python, а затем компилировать его в Javascript по своему желанию.
Также ознакомьтесь с информативным блогом:
К сожалению, вы не можете конвертировать Javascript в Python таким образом. Похоже, в целом это работает очень хорошо, раньше у них была онлайн-версия игры Bub'n'Bros на Javascript (сделанная из скомпилированного Python) (хотя сервер некоторое время не работал).
Существует мост, основанный на JavaScriptCore (из WebKit), но он довольно неполный: http://code.google.com/p/pyjscore/
Другая возможность - использовать XPCOM, например, в приложениях на основе XUL (например, Firefox, Thunderbird, Komodo и т. д.)
Многие из этих проектов, упомянутых выше, мертвы или умирают, им не хватает активности и интереса со стороны автора. Интересно проследить, как развивается эта сфера.
Напомним, что в эпоху реализаций на основе плагинов в лагере KDE была предпринята попытка решить эту проблему с использованием плагинов и неязыкового языка, и я создал Kross https://en.wikipedia.org/wiki/Kross_(software) - в моем понимание того, что это никогда не происходило даже внутри самого сообщества.
В течение этого периода проблем с куриным яйцом реализации на основе javascript- это определенно верный путь. Возможно, в будущем мы увидим чистую и полную поддержку Python изначально в браузерах.
Я играл с Pyjon некоторое время назад и, кажется, сумел написать eval Javascript непосредственно на Python и запустил простые программы... Хотя это не полная реализация JS, а скорее эксперимент. Получи это здесь: