集成 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/831pyjs
不再维护(最后一次提交是在 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 的最佳方式?的主要内容,如果未能解决你的问题,请参考以下文章
将 CSS 库集成到 WordPress 中的最简单方法是啥
Python 的 urllib.quote() 和 urllib.unquote() 的等效 Javascript 函数