是否可以集成 Python 和 JavaScript?例如,假设您希望能够在 JavaScript 中定义类并在 Python 中使用它们(反之亦然)。如果是这样,最好的方法是什么?我不仅对这是否可能感兴趣,而且对是否有人在“严肃”项目或产品中完成它感兴趣。
我猜想使用Jython和Rhino是可能的,例如,但我很好奇是否有人真的这样做过,以及是否有其他平台的解决方案(尤其是CPython)。
pyjs怎么样?
从上面的网站:
pyjs 是一个适用于 Web 和桌面的富 Internet 应用程序 (RIA) 开发平台。使用 pyjs,您可以完全用 Python 编写基于 JavaScript 的 Web 应用程序。
这里有一些东西,一个围绕 SeaMonkey Javascript 解释器的 Python 包装器...... http://pypi.python.org/pypi/python-spidermonkey
这个问题并不年轻,但已经提出了一些替代方案:
有两个项目允许在 python 对象和 javascript 对象之间进行“明显”转换,从 int 或 float 到 Number 和 str 或 unicode 到 String 的“明显”转换:PyV8,正如一位作者已经提到的:python-spidermonkey。
pyv8 实际上有两种实现——最初的实验是由 sebastien louisel 完成的,第二个(正在积极开发中)是由 flier liu 完成的。
我对这些项目的兴趣是将它们链接到pajamas,一个 python-to-javascript 编译器,以创建一个 JIT python 加速器。
所以那里有很多 - 这只是取决于你想做什么。
如果您只是对在 javascript 和 python 之间共享复杂的数据类型感兴趣,请查看jsonpickle。它包装了标准的 Python JSON 库,但在序列化和反序列化 Python 类和其他数据类型方面具有一些智能。
相当多的 Google App Engine 项目使用了这个库。 Joose和FirePython都包含 jsonpickle。
PyExecJS能够使用 PyV8、Node、JavaScriptCore、SpiderMonkey、JScript 中的每一个。
>>> import execjs
>>> execjs.eval("'red yellow blue'.split(' ')")
['red', 'yellow', 'blue']
>>> execjs.get().name
'Node.js (V8)'
有一个基于 JavaScriptCore(来自 WebKit)的桥,但它非常不完整: http ://code.google.com/p/pyjscore/
您可能还想查看 PyPy 项目 - 他们有一个 Python 到(任何)编译器,包括 Python 到 Javascript、C 和 llvm。这使您可以用 Python 编写代码,然后根据需要将其编译为 Javascript。
另外,查看内容丰富的博客:
不幸的是,您不能以这种方式将 Javascript 转换为 Python。总的来说,它似乎工作得很好,他们曾经有一个 Javascript(由编译的 Python 制成)版本的 Bub'n'Bros 在线游戏(尽管服务器已经关闭了一段时间)。
使用Js2Py将 JavaScript 转换为 Python,这是唯一可用的工具 :)
许多示例已经过时多年,并且涉及复杂的设置。你可以试试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!")
你也可以XPCOM
在XUL
Firefox、Thunderbird 或 Komodo 等基于应用程序中使用 .
前段时间我在玩 Pyjon,似乎设法直接在 Python 中编写 Javascript 的 eval 并运行简单的程序......虽然它不是 JS 的完整实现,而是一个实验。在这里获取:
上面提到的这些项目中有许多已经死亡或濒临死亡,缺乏作者方面的活动和兴趣。有趣的是关注这个领域的发展。
作为记录,在基于插件的实现时代,KDE 阵营试图用插件和非语言特定的方式解决这个问题,并创建了 Kross https://en.wikipedia.org/wiki/Kross_(software) - 在我的理解它甚至在社区内部也从未起飞。
在这个先有鸡还是先有蛋的问题时期,基于 javascript 的实现肯定是要走的路。也许将来我们会在浏览器中看到纯粹、干净、完整的 Python 支持。