Лучший способ интегрировать 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 по своему желанию.

http://codespeak.net/pypy

Также ознакомьтесь с информативным блогом:

http://morepypy.blogspot.com/

К сожалению, вы не можете конвертировать Javascript в Python таким образом. Похоже, в целом это работает очень хорошо, раньше у них была онлайн-версия игры Bub'n'Bros на Javascript (сделанная из скомпилированного Python) (хотя сервер некоторое время не работал).

http://bub-n-bros.sourceforge.net/

Существует мост, основанный на 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, а скорее эксперимент. Получи это здесь:

http://code.google.com/p/pyjon/

Другие вопросы по тегам