集成Python和JavaScript的最佳方式?

时间:2009-03-25 21:08:12

标签: javascript python brython transcrypt rapydscript

是否可以集成Python和JavaScript?例如,假设您希望能够在JavaScript中定义类并从Python中使用它们(反之亦然)。如果是这样,最好的方法是什么?我不仅对这是否可行感兴趣,而且如果任何人都在“严肃”的项目或产品中做到了

我猜这可能会使用JythonRhino作为一个例子,但我很好奇是否有人真的这样做了,以及是否有其他平台的解决方案(尤其是CPython)。

13 个答案:

答案 0 :(得分:25)

pyjs怎么样?

来自上述网站:

  

pyjs是一个用于Web和桌面的富Internet应用程序(RIA)开发平台。使用pyjs,您可以完全用Python编写基于JavaScript的Web应用程序。

答案 1 :(得分:18)

这是一个围绕SeaMonkey Javascript解释器的Python包装器...... http://pypi.python.org/pypi/python-spidermonkey

答案 2 :(得分:13)

这个问题并不完全年轻,但有一些替代方案:

  • Skulpt是Python的完全在浏览器中的实现。”
  • Brython - “用于客户端Web编程的Python 3实现”
  • RapydScript - “没有额外开销或怪癖的类似Python的JavaScript”
  • Transcrypt - “精益和平均Python 3.6到JavaScript编译器,具有多重继承,源映射,静态类型检查和选择性运算符重载。” (还on Github

答案 3 :(得分:9)

有两个项目允许在python对象和javascript对象之间进行“明显的”转换,从int或float到“明显”的转换,将str或unicode转换为String:PyV8,并且,正如一位作者所拥有的那样已经提到:python-spidermonkey

实际上有两个pyv8的实现 - 最初的实验是sebastien louisel,第二个(在积极的开发中)是由刘先生提供的。

我对这些项目的兴趣是将它们链接到pyjamas,这是一个python-to-javascript编译器,用于创建JIT python加速器。

所以那里有很多 - 这取决于你想做什么。

答案 4 :(得分:6)

如果您只想在javascript和python之间共享复杂的数据类型,请查看jsonpickle。它包装了标准的Python JSON库,但在序列化和反序列化Python类和其他数据类型方面有一些聪明之处。

相当多的Google App Engine项目都使用过这个库。 JooseFirePython都包含了jsonpickle。

答案 5 :(得分:3)

PyExecJS能够使用PyV8,Node,JavaScriptCore,SpiderMonkey,JScript。

>>> import execjs
>>> execjs.eval("'red yellow blue'.split(' ')")
['red', 'yellow', 'blue']
>>> execjs.get().name
'Node.js (V8)'

答案 6 :(得分:2)

有一个基于JavaScriptCore(来自WebKit)的桥梁,但它非常不完整: http://code.google.com/p/pyjscore/

答案 7 :(得分:2)

您可能还想查看PyPy项目 - 他们有一个Python到(任何)编译器,包括Python到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

答案 8 :(得分:1)

另一种可能性是使用XPCOM,比如基于XUL的应用程序(如firefox,thunderbird,komodo等)。

答案 9 :(得分:1)

前段时间我和Pyjon一起玩,似乎设法直接在Python中编写Javascript的eval并运行简单的程序......虽然它不是JS的完整实现,而是一个实验。 得到它:

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

答案 10 :(得分:1)

使用Js2Py将JavaScript翻译为Python,这是唯一可用的工具:)

答案 11 :(得分:1)

上面提到的许多这些项目已经死亡或者死亡,缺乏作者方面的活动和兴趣。有兴趣了解这个领域如何发展。

为了记录,在基于插件的实现时代,KDE阵营试图用插件和非语言特定的方式来解决这个问题并创建了Kross https://en.wikipedia.org/wiki/Kross_(software) - 据我所知,它甚至从未在社区本身。

在这个鸡和鸡蛋问题的时候,基于javascript的实现肯定是要走的路。也许将来我们会在浏览器中看到纯粹,干净,完整的Python支持。

答案 12 :(得分:1)

许多示例已经过时多年并且涉及复杂的设置。你可以试试JSPyBridge(完全披露:我是作者)。

这是一个双向桥梁,可让您使用 Python 中的 JavaScript 代码,反之亦然。也就是说Python代码可以调用JS回调,JS代码可以调用Python回调。

从 JS 访问 Python,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.

从python访问JS:

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!")