71

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

我猜想使用JythonRhino是可能的,例如,但我很好奇是否有人真的这样做过,以及是否有其他平台的解决方案(尤其是CPython)。

4

13 回答 13

27

pyjs怎么样?

从上面的网站:

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

于 2009-03-25T22:00:23.007 回答
20

这里有一些东西,一个围绕 SeaMonkey Javascript 解释器的 Python 包装器...... http://pypi.python.org/pypi/python-spidermonkey

于 2009-03-25T21:13:09.393 回答
16

这个问题并不年轻,但已经提出了一些替代方案:

  • Skulpt是一个完全在浏览器中实现的 Python。”
  • Brython -“用于客户端 Web 编程的 Python 3 实现”
  • RapydScript - “没有额外开销或怪癖的类似 Python 的 JavaScript”
  • Transcrypt - “精益求精的 Python 3.6 到具有多重继承、源映射、静态类型检查和选择性运算符重载的 JavaScript 编译器。” (也在Github 上
于 2016-08-23T08:25:03.707 回答
10

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

pyv8 实际上有两种实现——最初的实验是由 sebastien louisel 完成的,第二个(正在积极开发中)是由 flier liu 完成的。

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

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

于 2009-04-08T18:18:28.083 回答
7

如果您只是对在 javascript 和 python 之间共享复杂的数据类型感兴趣,请查看jsonpickle。它包装了标准的 Python JSON 库,但在序列化和反序列化 Python 类和其他数据类型方面具有一些智能。

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

于 2009-03-25T23:26:03.800 回答
4

PyExecJS能够使用 PyV8、Node、JavaScriptCore、SpiderMonkey、JScript 中的每一个。

>>> import execjs
>>> execjs.eval("'red yellow blue'.split(' ')")
['red', 'yellow', 'blue']
>>> execjs.get().name
'Node.js (V8)'
于 2014-08-01T17:24:22.937 回答
2

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

于 2009-03-25T21:47:03.523 回答
2

您可能还想查看 PyPy 项目 - 他们有一个 Python 到(任何)编译器,包括 Python 到 Javascript、C 和 llvm。这使您可以用 Python 编写代码,然后根据需要将其编译为 Javascript。

http://codespeak.net/pypy

另外,查看内容丰富的博客:

http://morepypy.blogspot.com/

不幸的是,您不能以这种方式将 Javascript 转换为 Python。总的来说,它似乎工作得很好,他们曾经有一个 Javascript(由编译的 Python 制成)版本的 Bub'n'Bros 在线游戏(尽管服务器已经关闭了一段时间)。

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

于 2009-03-26T03:01:25.513 回答
2

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

于 2014-12-13T15:08:56.953 回答
2

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

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

使用 ES6 导入系统从 JS、numpy + matplotlib 示例访问 Python:

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!")
于 2021-07-23T10:15:05.010 回答
1

你也可以XPCOMXULFirefox、Thunderbird 或 Komodo 等基于应用程序中使用 .

于 2011-01-25T00:27:57.870 回答
1

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

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

于 2011-11-18T11:27:41.653 回答
1

上面提到的这些项目中有许多已经死亡或濒临死亡,缺乏作者方面的活动和兴趣。有趣的是关注这个领域的发展。

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

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

于 2018-03-15T12:01:03.223 回答