javascript运行时-JavaScript 和 Python 代码可以一起使用吗?

2023-08-26 0 2,132 百度已收录

来源丨经授权转载自代码秘密花园(ID:code_mmhy)

作者丨ConardLi

最近,我在Github上发现了一个特别有趣的项目PythonMonkey,它可以让我们直接在JavaScript中运行Python代码,也可以在Python中运行JavaScript和WebAssembly代码,几乎没有性能损失。

PythonMonkey 是一个使用 Mozilla 的 SpiderMonkey JavaScript 引擎构建的 Python 库javascript运行时,以实现 Python 和 JavaScript 之间的互操作性。 它允许 JavaScript 库在 Python 代码中无缝使用,反之亦然,而不会造成很大的性能损失。 例如,我们可以从 JavaScript 库调用 NumPy 等 Python 包,或者直接从 Python 使用 crypto-js 等 NPM 包。 此外,使用 WebAssembly API 和 SpiderMonkey 引擎在 Python 中执行 WebAssembly 模块非常简单。 开发人员还可以使用PythonMonkey构建用Python编译的代码并在JS中执行,使用SpiderMonkey的即时编译器获得接近原生的速度。

PythonMonkey 还附带 PMJS,这是一个类似 Node.js 的 JavaScript 运行时环境,支持从 JavaScript 调用 Python 库。

下面是一个简单的“hello world”示例,演示了从 JavaScript 生成并返回到 Python 上下文的字符串:

>>> import pythonmonkey as pm 
>>> hello = pm.eval(" 'Hello World'.toUpperCase(); "
>>> print(hello) 
'HELLO WORLD'

下面是一个稍微复杂一些的示例,演示了将 Python 打印函数作为参数传递给 JavaScript 函数,然后从 Python 调用该 JavaScript 函数:

>>> import pythonmonkey as pm 
  >>> hello = pm.eval("(func) => { func('Hello World!')}"
  >>> hello(print) 
Hello World!

我们可以通过编写以下代码直接在 JavaScript 代码中使用 Python 的 print 函数:

const pyPrint = python.eval("print");
pyPrint("Hello, World!"); // this outputs "Hello, World!"

我认为更实际的应用场景是,我们可以轻松地将JavaScript库移植到Python,而不必承担使用Python重绘库和维护迁移的巨大成本。 JavaScript 处理异步代码比 Python 好得多。 我们只需要做一些简单的事情,如下所示:

my-javascript-module.js

exports.sayHello = () => { console.log('hello, world') };

主要.py

import pythonmonkey as pm
test = pm.require('./my-javascript-module');
test.sayHello() # this prints hello, world

同样,我们可以通过 CommonJS 从 JavaScript 加载 Python 模块:

my-python-module.py

def getStringLength(s):
  return len(s)

exports['getStringLength'] = getStringLength

my-javascript-module.js

const { getStringLength } = require('./my-python-module');

function printStringLength(s{
  console.log(`String: "${s}" has a length of ${getStringLength(s)}`);
}

module.exports = { printStringLength, };

主要.py

import pythonmonkey as pm
test = pm.require('./my-javascript-module');
test.printStringLength("Hello, world!"# String: "Hello, world!" has a length of 13

PythonMonkey 还利用了其他一些 SpiderMonkey 功能,例如其 WebAssembly (WASM) 引擎,该引擎允许 Python 在沙箱中运行来自各种语言(例如 C、C++、Rust 等)的不受信任的 WASM 代码。

要在 Python 中调用 WebAssembly 函数:

import asyncio
import pythonmonkey as pm

async def async_fn():
  # read the factorial.wasm binary file
  file = open('factorial.wasm''rb')
  wasm_bytes = bytearray(file.read())

  # instantiate the WebAssembly code
  WebAssembly = pm.eval('WebAssembly')
  wasm_fact = await WebAssembly.instantiate(wasm_bytes, {})

  # return the "fac" factorial function from the wasm module
  return wasm_fact.instance.exports.fac;

# await the promise which returns the factorial WebAssembly function
factorial = asyncio.run(async_fn())

# execute WebAssembly code in Python!
print(factorial(4)) # this outputs "24.0" since factorial(4) == 24
print(factorial(5)) # this outputs "120.0"
print(factorial(6)) # this outputs "720.0"

例子还有很多,我们可以查看Github上的反例:

已经有几个在 Python 中运行 JavaScript 的项目,例如 JS2PY、PyV8 和 Metacall。

JS2Py 完全用 Python 实现,这消除了对 V8 或 SpiderMonkey 等较小引擎的需要。 但这种方法也存在一些问题。 如果没有现有 JavaScript 引擎的帮助,JS2Py 很难从数百万人每晚使用的浏览器中的 V8 或 SpiderMonkey 等引擎提供的强大的、不断更新和验证的代码库中学习。 从。。得到好处。 此外,JS2Py 还缺乏 WASM 引擎、对最新 JavaScript 规范 (ECMA-262) 的支持以及这些引擎外部的强大 JIT。 现代异步 JS 编程中广泛使用的 JavaScript Promises 和 Async/Await 在 JS2Py 中也没有,但在 PythonMonkey 中可用。 JS2Py 用 Python 编写,面临 SpiderMonkey 中不存在的性能限制; SunSpider JavaScript 基准测试报告显示javascript运行时,使用 PythonMonkey 比 JS2Py 快 1162.5 倍。

PyV8 和 Cloudflare 的现代实现是 Google V8 JavaScript 引擎绑定的 Python 包装器。 这意味着它的运行级别低于 PythonMonkey,并且不支持风暴循环功能,例如 JavaScript 的 Promise 和 async/await。

Metacall 是一个可扩展、可嵌入、可互操作的跨平台多语言运行时,可以与多种编程语言(如 JavaScript、Python、Ruby、Rust、C#、Java 等)进行互操作。 但 Metacall 广泛的语言支持也是有代价的,需要在 Python 包之外的系统上安装额外的软件才能运行。 此外,Metacall 会复制 Python 和 JavaScript 之间传递的数据,而不是像 PythonMonkey 那样通过引用传递,从而导致性能下降。

虽然替代项目与 PythonMonkey 的模型有相似之处,但它们缺乏 PythonMonkey 所提出的互操作性、易用性和速度。

终于

参考:

1、

2、

3.

4.

5.

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 javascript javascript运行时-JavaScript 和 Python 代码可以一起使用吗? https://www.wkzy.net/game/156340.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务