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