如何集成Python和JavaScript?

75

是否可以集成Python和JavaScript? 比如说,想象一下你希望能够在JavaScript中定义类,并从Python(或反之亦然)中使用它们。如果可以,那么最好的方法是什么?我不仅对此是否可能感兴趣,还对是否有人在“严肃”的项目或产品中完成过该操作感兴趣。

我猜可以使用JythonRhino等工具来实现,但我很好奇是否有人确实这样做了,以及是否有其他平台(特别是CPython)的解决方案。


1
也许您可以使用Emscripten将CPython编译为JavaScript,然后在浏览器中运行CPython。可能可以从JavaScript调用Python函数,反之亦然。http://syntensity.com/static/python.html - Anderson Green
1
@AndersonGreen 这已经完成了:pypyjs - https://github.com/rfk/pypyjs - denfromufa
就此而言,这个SO答案提出了一种统一的方法来在JS和Python之间共享对象,并且它是在 [这个repo] (https://github.com/jdthorpe/ajvpy) 中实现的,该repo通过webpack打包了一个NodeJS模块并将其公开为Python模块。 - Jthorpe
1
对于在谷歌上找到这篇文章的人,请查看下面我使用JSPyBridge的现代答案。 - Extreme
14个回答

28

那么 pyjs 怎么样?

从以上网站可以看到:

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


1
@AppleGrew 是否有可能在浏览器中完全运行Pyjamas(没有任何服务器端组件)? - Anderson Green
5
请注意,pyjs不支持Python 3.0+。 https://github.com/pyjs/pyjs/issues/831 - AXO
pyjs 不再维护(最后一次提交是在2015年9月22日)。 - Franck Dernoncourt

21

这似乎是我所寻找的最接近的东西,谢谢。 - Jacob Gabrielson
一个活跃的spidermonkey库(https://github.com/Distributive-Network/PythonMonkey) - Al Mahdi

17

这个问题并不新鲜,但出现了一些替代方案:

  • "Skulpt是一个完全基于浏览器的Python实现。"
  • Brython - "用于客户端Web编程的Python 3实现"
  • RapydScript - "类Python的JavaScript,没有额外的开销或怪癖"
  • Transcrypt - "精简且高效的Python 3.6到JavaScript编译器,支持多重继承、源代码地图、静态类型检查和选择性运算符重载"(也在Github上

6
只是想补充一下,Skulpt和Brython两者都只是玩具而不是完整的编译器/语言。在性能方面,RapydScript和Transcrypt会胜过它们。事实上,JS缺乏高效的Python解释器是RapydScript被发明的原因之一。现在,RapydScript还有一个额外的好处就是类型安全,就像TypeScript一样。免责声明:我是RapydScript的维护者。 - Alexander Tsepkov
@AlexanderTsepkov 我没时间测试那些,所以感谢你的添加 :) - Tobias Kienzler
1
Transcrypt可以通过pip安装,如果你不想深入了解js的生态系统,这是一个不错的选择。然而,就我目前的了解,RapydScript似乎是最快的转码选项。这里描述了一系列不错的选项。还有一个叫做Jiphy的工具,但似乎已经不再被维护了。 - Jay

10
有两个项目可以实现Python对象和JavaScript对象之间的“显然”转换,可以将int或float转换为Number,str或unicode转换为String:PyV8python-spidermonkey。实际上,PyV8有两个实现版本,最初的实验是由Sebastien Louisel完成的,第二个版本(正在积极开发中)是由Flier Liu完成的。我对这些项目的兴趣在于将它们与Python-to-JavaScript编译器pyjamas连接起来,以创建JIT Python加速器。因此,有很多选择-只要取决于你想做什么。

1
PyV8仍然得到良好的维护,不幸的是,与此处提供的几乎所有其他想法相比。 - Matthias Urlichs

7
如果您只是想在JavaScript和Python之间共享复杂数据类型,请查看 jsonpickle。它封装了标准的Python JSON库,但具有序列化和反序列化Python类和其他数据类型的一些智能功能。
相当多的Google App Engine项目使用了这个库。JooseFirePython都包含jsonpickle。

请注意,jsonpickle使用非标准的“py/ref”引用类型,这使得它对于非Python客户端更难使用。目前还没有关闭它的方法。http://code.google.com/p/jsonpickle/issues/detail?id=9 - pimlottc

6
许多示例已经过时且涉及复杂的设置。您可以尝试使用JSPyBridge(完整披露:我是作者)。
这是一个双向桥梁,允许您从Python使用JavaScript代码,反之亦然。这意味着Python代码可以调用JS回调,而JS代码也可以调用Python回调。
使用ES6导入系统,从JS访问Python,numpy + matplotlib示例:
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(不使用顶层 await):

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

4

PyExecJS 能够使用 PyV8、Node、JavaScriptCore、SpiderMonkey 和 JScript。

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

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

1
现在支持Python 3 - Piotr Dabkowski
仅支持 ES 5.1。 - Al Mahdi

2

2
你可能还想看看PyPy项目 - 他们有一个Python到(任何语言)的编译器,包括Python到Javascript、C和llvm。这使你能够用Python编写代码,然后按照你的需求将其编译成Javascript。

http://codespeak.net/pypy

另外,请查看这篇信息丰富的博客:

http://morepypy.blogspot.com/

不幸的是,你不能用这种方式将Javascript转换为Python。总体来说,它似乎运行得非常好,他们曾经在网上发布过一个由编译后的Python制作的Javascript版本的Bub'n'Bros游戏(尽管服务器已经停止运行一段时间了)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接