Last active
June 9, 2024 22:58
-
-
Save pims/711549577759ad1341f1a90860f1f3a5 to your computer and use it in GitHub Desktop.
Example of running a python script via python-wasi using the wasmtime wasm runtime
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
print("hello from a python script") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
hello from a python script |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
wasmtime==5.0.0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from wasmtime import Config, Engine, Linker, Module, Store, WasiConfig | |
def main(): | |
cfg = Config() | |
# necessary if we want to interrupt execution after some amount of instructions executed | |
cfg.consume_fuel = True | |
cfg.cache = True | |
engine = Engine(cfg) | |
linker = Linker(engine) | |
linker.define_wasi() | |
""" | |
from https://wasmlabs.dev/articles/python-wasm32-wasi/ | |
wget https://github.com/vmware-labs/webassembly-language-runtimes/releases/download/python%2F3.11.1%2B20230118-f23f3f3/python-aio-3.11.1.zip | |
unzip python-aio-3.11.1.zip | |
rm python-aio-3.11.1.zip | |
tree | |
. | |
├── app.py [new] | |
├── bin | |
│ ├── python-3.11.1-wasmedge.wasm | |
│ └── python-3.11.1.wasm | |
├── runner.py [this file] | |
└── usr | |
└── local | |
└── lib | |
├── python3.11 | |
│ ├── lib-dynload | |
│ └── os.py | |
└── python311.zip | |
""" | |
module = Module.from_file(linker.engine, "bin/python-3.11.1.wasm") | |
config = WasiConfig() | |
""" | |
cat app.py | |
print("hello from a python script") | |
""" | |
config.argv = ("python", "app.py") | |
config.preopen_dir(".", "/") | |
# mkdir chroot, which is an arbitrary name for a directory | |
config.stdout_file = 'chroot/out.log' # will be created if it doesn't exist | |
config.stderr_file = 'chroot/err.log' # will be created if it doesn't exist | |
store = Store(linker.engine) | |
store.add_fuel(500_000_000) # amount of fuel limits how many instructions can be executed | |
store.set_wasi(config) | |
instance = linker.instantiate(store, module) | |
# _start is the default wasi main function | |
start = instance.exports(store)["_start"] | |
mem = instance.exports(store)["memory"] | |
mem_size = mem.size(store) | |
data_len = mem.data_len(store) | |
print(f"mem.size: {mem_size} pages of 64kb") | |
print(f"mem.data_len: {data_len:_}") | |
start(store) | |
consumed = store.fuel_consumed() | |
print(f"fuel consumed: {consumed:_}") | |
with open('chroot/out.log') as f: | |
print(f.read()) | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment