运行WebAssembly二进制的Python扩展
项目描述
Wasmer Python

基于 Wasmer 的完整且成熟的 WebAssembly 运行时,适用于 Python。
特性
- 易于使用:
wasmer
API 仿照标准的 WebAssembly API - 快速:
wasmer
尽可能快地执行 WebAssembly 模块,接近 原生速度 - 安全:所有对 WebAssembly 的调用都将快速执行,更重要的是,它们是完全安全和沙箱化的
- 模块化:
wasmer
可以使用不同的引擎或编译器编译 WebAssembly 模块
文档:浏览详细的 API 文档 https://wasmerio.github.io/wasmer-python/api/wasmer/wasmer.html,其中包含大量示例
示例 作为教程:浏览 examples/ 目录,这是完整介绍的绝佳地方!
快速介绍
wasmer
包提供了执行 WebAssembly 模块所需的 API。简而言之,wasmer
将 WebAssembly 模块编译成编译后的代码,然后执行它。 wasmer
设计用于在各种环境和平台上工作:从小型单板计算机到大型强大的服务器,包括更多异类平台。为了满足这些要求,Wasmer 提供了 2 个引擎和 3 个编译器。
简而言之,引擎 负责驱动 WebAssembly 模块的 编译 和 执行。通过扩展,无头 引擎只能执行 WebAssembly 模块,即已经编译或编译、序列化和反序列化的模块。默认情况下,wasmer
包包含 2 个无头引擎
wasmer.engine.JIT
,编译后的机器代码驻留在内存中wasmer.engine.Native
,编译后的机器代码驻留在共享对象文件(.so
、.dylib
或.dll
)中,并原生执行
由于 wasmer
在其包中不嵌入编译器,因此引擎是无头的,即它们不能编译 WebAssembly 模块;它们只能执行它们。编译器存在于它们自己的独立包中。让我们简要介绍它们
编译器包 | 描述 | PyPi |
---|---|---|
wasmer_compiler_singlepass |
编译时间超级快,执行时间较慢。不易受到 JIT-bombs 影响。非常适合区块链 | |
wasmer_compiler_cranelift |
编译时间和执行时间都很快。非常适合开发 | |
wasmer_compiler_llvm |
编译时间慢,执行时间非常快(接近原生,有时更快)。非常适合生产 |
我们通常推荐使用 wasmer_compiler_cranelift
进行开发,并在生产中使用 wasmer_compiler_llvm
通过阅读 wasmer.engine
子模块的文档 了解更多。
安装
要安装 wasmer
Python 包,以及 wasmer_compiler_cranelift
编译器,只需在您的 shell 中运行以下命令
$ pip install wasmer==1.1.0
$ pip install wasmer_compiler_cranelift==1.1.0
然后您就可以开始享受乐趣了!
示例
我们强烈建议您阅读 examples/
目录,其中包含一系列示例/教程。这是通过阅读示例学习最佳的地方!
但对于你们中最渴望的,我们知道你们为数不少,顽皮的你们,在 examples/appendices/simple.rs
中有一个快速的玩具程序,用 Rust 编写。
#[no_mangle]
pub extern fn sum(x: i32, y: i32) -> i32 {
x + y
}
编译成 WebAssembly 后,生成了 examples/appendices/simple.wasm
二进制文件。(下载它)。
然后,我们可以在 Python 中执行它。
from wasmer import engine, Store, Module, Instance
from wasmer_compiler_cranelift import Compiler
# Let's define the store, that holds the engine, that holds the compiler.
store = Store(engine.JIT(Compiler))
# Let's compile the module to be able to execute it!
module = Module(store, open('simple.wasm', 'rb').read())
# Now the module is compiled, we can instantiate it.
instance = Instance(module)
# Call the exported `sum` function.
result = instance.exports.sum(5, 37)
print(result) # 42!
最后,运行并享受。
$ python examples/appendices/simple.py
开发
Python 扩展是用 Rust 编写的,使用了 pyo3
和 maturin
。
首先,您需要安装 Rust 和 Python。我们不会冒犯您,向您解释如何安装 Python(如果您真的需要,请查看 pyenv
)。对于 Rust,我们建议使用 rustup
,然后
$ rustup install stable
为了设置您的环境,您需要 just
,然后安装此项目的先导程序。
$ cargo install just
$ just --list # to learn about all the available recipes
$ just prelude
这将安装 Python 和 Rust 的 pyo3
和 maturin
。它还将安装 virtualenv
。
然后,只需运行
$ source .env/bin/activate
$ just build api
$ just build compiler-cranelift
$ python examples/appendices/simple.py
支持的平台
我们试图为尽可能多的平台和架构提供轮子。目前,以下是支持的平台和架构:
平台 | 架构 | 三重 | 包 | |
---|---|---|---|---|
Linux | amd64 |
x86_64-unknown-linux-gnu |
wasmer |
✅ |
wasmer_compiler_singlepass |
✅ | |||
wasmer_compiler_cranelift |
✅ | |||
wasmer_compiler_llvm |
✅ | |||
aarch64 |
aarch64-unknown-linux-gnu |
wasmer |
✅ | |
wasmer_compiler_singlepass |
❌ 1 | |||
wasmer_compiler_cranelift |
✅ | |||
wasmer_compiler_llvm |
✅ | |||
Darwin | amd64 |
x86_64-apple-darwin |
wasmer |
✅ |
wasmer_compiler_singlepass |
✅ | |||
wasmer_compiler_cranelift |
✅ | |||
wasmer_compiler_llvm |
✅ | |||
Windows | amd64 |
x86_64-pc-windows-msvc |
wasmer |
✅ |
wasmer_compiler_singlepass |
✅ | |||
wasmer_compiler_cranelift |
✅ | |||
wasmer_compiler_llvm |
❌ 2 |
说明
- 1
wasmer_compiler_singlepass
目前不支持aarch64
- 2
wasmer_compiler_llvm
目前在 Windows 上打包不正确
轮子是为以下 Python 版本构建的:
- Python 3.7
- Python 3.8
- Python 3.9
- Python 3.10
了解“回退” py3-none-any
轮子
py3-none-any.whl
专门构建了一个 wasmer-$(version)-py3-none-any
轮子作为回退。该 wasmer
库将可安装,但会引发一个表示“该系统上不可用”的 ImportError
异常。
如果之前没有匹配项,则将安装此轮子(通过阅读 PEP 425,构建分发的兼容性标签 了解更多)。
测试
构建所有包并运行测试
$ just build-all
$ just test
什么是 WebAssembly?
WebAssembly(简称 Wasm)是一种基于堆栈的虚拟机的二进制指令格式。Wasm 被设计为一种可移植的目标,用于编译高级语言如 C/C++/Rust,使得部署在客户端和服务器应用程序的 Web 上成为可能。
关于速度
WebAssembly 通过利用广泛平台上可用的 常见硬件功能 来实现以原生速度执行。
关于安全性
WebAssembly 描述了一个内存安全、沙盒化的 执行环境 [...]
许可证
整个项目都在 MIT 许可证下。请阅读 LICENSE
文件。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源代码分发
构建分发
wasmer-1.1.0-py3-none-any.whl 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2caf8c67feae9cd4246421551036917811c446da4f27ad4c989521ef42751931 |
|
MD5 | ffdb0cf30e3528769d055b56e60a9073 |
|
BLAKE2b-256 | 396b30e25924cae7add377f5601e71c778e9a1e515c7a58291f52756c1bb7e87 |
wasmer-1.1.0-cp310-none-win_amd64.whl 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d0d93aec6215893d33e803ef0a8d37bf948c585dd80ba0e23a83fafee820bc03 |
|
MD5 | cae83dc46379ae9e7f71feaa6d4da6a2 |
|
BLAKE2b-256 | 2470ca7bf7a3f85d8de745eca73e40bc83cf86bb52ea494b33721fc0572889ab |
wasmer-1.1.0-cp310-cp310-manylinux_2_24_x86_64.whl 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ab1ae980021e5ec0bf0c6cdd3b979b1d15a5f3eb2b8a32da8dcb1156e4a1e484 |
|
MD5 | fce28ee1bf37ec5c254d94bee67c3c64 |
|
BLAKE2b-256 | a7793f53cf611cbdd04a9b9997bf3ad18e5602350f90d404c162fbf3112684f2 |
wasmer-1.1.0-cp310-cp310-macosx_10_7_x86_64.whl 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c2af4b907ae2dabcac41e316e811d5937c93adf1f8b05c5d49427f8ce0f37630 |
|
MD5 | 453d687c73340fa0eb7495bf545292c8 |
|
BLAKE2b-256 | cf0a9e5efd92e5cf24d5c08030b4f76dcdf10cbc55c639bbf4df8aeb0c76d448 |
wasmer-1.1.0-cp39-none-win_amd64.whl 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a0a4730ec4907a4cb0d9d4a77ea2608c2c814f22a22b73fc80be0f110e014836 |
|
MD5 | 4737eb60ac0b839862563a13b922231e |
|
BLAKE2b-256 | b032f6978008cdfd7b932a9ae7dc233688f0a4db29b73b59c23d9182731d57a3 |
wasmer-1.1.0-cp39-cp39-manylinux_2_24_x86_64.whl 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c0b37117f6d3ff51ee96431c7d224d99799b08d174e30fcd0fcd7e2e3cb8140c |
|
MD5 | a4d98f3ff8a72b3170e8d49ddd72df40 |
|
BLAKE2b-256 | dda66f9cf77500073969c96afd626857694418d707cc97c15705665250420c67 |
哈希值 for wasmer-1.1.0-cp39-cp39-macosx_10_7_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ee442f0970f40ec5e32011c92fd753fb2061da0faa13de13fafc730c31be34e3 |
|
MD5 | f3277357137c045fcfecdcc6ac6135d4 |
|
BLAKE2b-256 | 1242142b95b68e3cb9f1b49174677e1861575a47fdac0221f46d9a8631d2b469 |
哈希值 for wasmer-1.1.0-cp38-cp38-manylinux_2_24_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b9e5605552bd7d2bc6337519b176defe83bc69b98abf3caaaefa4f7ec231d18a |
|
MD5 | 1549f14af83dce9a491e617455227a60 |
|
BLAKE2b-256 | 93f597ecad043c138f48c37ce4f0fa782831b5d2dbb3f7d80031f07105b9e7ba |
哈希值 for wasmer-1.1.0-cp38-cp38-macosx_10_7_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 214d9a3cfb577ea9449eb2b5f13adceae34c55365e4c3d930066beb86a7f67bc |
|
MD5 | e34b6cf9747334bcc7732aea8b52808f |
|
BLAKE2b-256 | a177e8f9b4e32fcdf2d54dfab67e26cc7557a094e85817281e8f203294d4ea52 |
哈希值 for wasmer-1.1.0-cp37-cp37m-manylinux_2_24_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 85e6a5bf44853e8e6a12e947ee3412da9e84f7ce49fc165ba5dbd293e9c5c405 |
|
MD5 | 8fb5a3cd7148fb716f869510b8b73d3b |
|
BLAKE2b-256 | 5c7f9b96442cc3984baa7a5e5651901202176cb30fe879fef0c4f79020566262 |
哈希值 for wasmer-1.1.0-cp37-cp37m-macosx_10_7_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1e63d16bd6e2e2272d8721647831de5c537e0bb08002ee6d7abf167ec02d5178 |
|
MD5 | b1a259efaa6e55f138ae85f5fabcccc0 |
|
BLAKE2b-256 | 7121091c53b34e312bea376cb4a5806834f84e674e7f78d52eb92423cedf8a5f |