集成 Python 和 JavaScript 的最佳方式?

Posted

技术标签:

【中文标题】集成 Python 和 JavaScript 的最佳方式?【英文标题】:Best way to integrate Python and JavaScript? 【发布时间】:2010-10-15 13:41:04 【问题描述】:

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

我猜可能使用Jython 和Rhino 为例,但我很好奇是否有人真正这样做过,以及是否有其他平台的解决方案(尤其是@987654323 @)。

【问题讨论】:

也许您可以使用 Emscripten 将 CPython 编译为 JavaScript,然后在浏览器中运行 CPython。可以从 JavaScript 调用 Python 函数,反之亦然。 syntensity.com/static/python.html @AndersonGreen 这已经完成了:pypyjs - github.com/rfk/pypyjs 不管怎样,this SO answer 提供了一种在 JS 和 Python 之间共享对象的统一方法,并在 this repo 中实现,它简单地包装了一个通过 webpack 捆绑的 NodeJS 模块并将其公开为 Python模块。 对于那些在 Google 上找到此内容的人,请在下面使用 JSPyBridge 查看我的现代答案。 【参考方案1】:

pyjs怎么样?

来自上述网站:

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

【讨论】:

@AppleGrew 是否可以完全在浏览器中运行睡衣(无需任何服务器端组件)? 注意pyjs不支持Python 3.0+ github.com/pyjs/pyjs/issues/831 pyjs 不再维护(最后一次提交是在 2015 年 9 月 22 日)。【参考方案2】:

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

【讨论】:

这似乎是我所寻找的最接近的东西;谢谢。【参考方案3】:

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

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

【讨论】:

只是为了增加我的两分钱,Skulpt 和 Brython 都是玩具,而不是成熟的编译器/语言。 RapydScript 和 Transcrypt 将在性能方面围绕它们运行。事实上,JS 中没有高性能的 Python 解释器是 RapydScript 最初被发明的原因。 RapydScript 现在具有类型安全的额外好处,就像 TypeScript 一样。免责声明:我是 RapydScript 维护者。 @AlexanderTsepkov 我没有时间测试这些,所以谢谢你的补充:) Transcrypt 可以通过 pip 安装,如果您不想沉浸在 js 生态系统中,那就太好了。然而,到目前为止,RapydScript 似乎是最快的转译选项。 here 描述了一系列不错的选项。还有 Jiphy 似乎没有维护。【参考方案4】:

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

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

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

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

【讨论】:

pyv8 仍然得到很好的维护,不幸的是,与这里的答案中提出的几乎所有其他想法相比。【参考方案5】:

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

很多 Google App Engine 项目都使用了这个库。 Joose 和 FirePython 都包含 jsonpickle。

【讨论】:

请注意,jsonpickle 使用非标准的“py/ref”引用类型,这使得非 python 客户端更难使用。目前没有办法关闭它。 code.google.com/p/jsonpickle/issues/detail?id=9【参考方案6】:

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

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

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

您可能还想查看 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

【讨论】:

【参考方案9】:

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

【讨论】:

现在支持 Python 3【参考方案10】:

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

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

【讨论】:

【参考方案11】:

上面提到的许多项目都已经死了或垂死了,缺乏作者方面的活动和兴趣。关注这个领域的发展很有趣。

据记录,在基于插件的实现时代,KDE 阵营曾尝试通过插件和非语言特定的方式来解决这个问题,并创建了 Kross https://en.wikipedia.org/wiki/Kross_(software) - 据我了解,即使在社区本身内部它也从未起飞.

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

【讨论】:

【参考方案12】:

您还可以使用XPCOM,例如在基于XUL 的应用程序中,例如Firefox、Thunderbird 或Komodo。

【讨论】:

【参考方案13】:

许多示例已经过时多年,并且涉及复杂的设置。你可以试试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!")

【讨论】:

以上是关于集成 Python 和 JavaScript 的最佳方式?的主要内容,如果未能解决你的问题,请参考以下文章

是否有区分 Python 集成测试和单元测试的约定?

将 CSS 库集成到 WordPress 中的最简单方法是啥

Python 的 urllib.quote() 和 urllib.unquote() 的等效 Javascript 函数

JavaScript

在nodejs中导入MySQL数据库进行集成测试的最简单方法

如何将 Python Lambda 函数集成到 AWS Amplify 的管道中