2 个版本
0.2.1 | 2021年10月19日 |
---|---|
0.2.0 | 2021年5月19日 |
#445 在 操作系统
16KB
261 行
WasmEdge进程接口
这是一个Rust库,为在WasmEdge(原名SSVM)上执行时提供运行命令功能的语法。
从高层次概述来看,我们实际上正在构建一个进程接口,允许本地操作系统(WasmEdge在其中运行)在运行时执行中发挥作用。具体来说,在Wasm执行过程中执行带有参数和环境值的命令。
如何使用此库
Rust依赖关系
开发者将 wasmedge_process_interface
包 添加为他们的 Rust -> Wasm
应用的依赖项。例如,将以下行添加到应用程序的 Cargo.toml
文件中。
[dependencies]
wasmedge_process_interface = "^0.2.1"
开发者将 Command
模块从 wasmedge_process_interface
带入他们的 Rust -> Wasm
应用程序的代码中。例如,将以下代码添加到他们的 main.rs
文件顶部。
use wasmedge_process_interface::Command;
使用程序名执行命令
开发者可以使用如下的语法来执行命令,例如使用 std::process::Command
。编译后,输出目标Wasm文件将包含有关运行外部命令的宿主函数的导入。
创建命令对象
let mut cmd = Command::new("ls");
追加参数
let mut cmd = Command::new("ls");
cmd.arg("-al");
或者以下内容
let cmd = Command::new("ls").arg("-al");
或者以下内容
let cmd = Command::new("ls").arg("-alF").arg("..");
或者以下内容
let cmd = Command::new("ls").args(&["-alF", ".."]);
追加环境变量
let mut cmd = Command::new("printenv").arg("ONE").env("ONE", "1");
或者以下内容
use std::collections::HashMap;
let mut cmd = Command::new("rusttest");
let mut hash: HashMap<String, String> = HashMap::new();
hash.insert(String::from("ENV1"), String::from("VALUE1"));
hash.insert(String::from("ENV2"), String::from("VALUE2"));
let mut cmd = Command::new("printenv").arg("ENV1").envs(hash);
追加 stdin
let mut cmd = Command::new("python3").stdin("print(\"HELLO PYTHON\")");
或者以下内容
// Consider about the `\n` charactor in stdin strings.
let mut cmd = Command::new("python3").stdin("import time\n").stdin("print(time.time())");
指定执行超时
// Timeout values are in milliseconds.
let mut cmd = Command::new("python3")
.stdin("from time import sleep\n")
.stdin("print('PYTHON start sleep 2s', flush=True)\n")
.stdin("sleep(2)\n")
.stdin("print('PYTHON end sleep 2s', flush=True)\n")
.timeout(1000);
执行并获取输出
请记住检查子进程的返回状态。
let out = Command::new("python3")
.stdin("from time import sleep\n")
.stdin("import sys\n")
.stdin("print('stdout: PYTHON start sleep 2s', flush=True)\n")
.stdin("print('stderr: PYTHON start sleep 2s', file=sys.stderr, flush=True)\n")
.stdin("sleep(2)\n")
.stdin("print('stdout: PYTHON end sleep 2s', flush=True)\n")
.stdin("print('stderr: PYTHON end sleep 2s', file=sys.stderr, flush=True)\n")
.timeout(1000)
.output();
println!(" return code : {}", out.status);
println!(" stdout :");
print!("{}", str::from_utf8(&out.stdout).expect("GET STDOUT ERR"));
println!(" stderr :");
print!("{}", str::from_utf8(&out.stderr).expect("GET STDERR ERR"));
Crates.io
官方包在 crates.io 上提供。