#ssvm #wasm-interface #command #execute-command #running #run-time #second-state

ssvm_process_interface

一个Rust库,为Rust到WebAssembly的开发者提供运行命令功能的语法

2个版本

0.1.4 2021年5月19日
0.1.3 2020年10月19日

#407 in 操作系统

自定义许可证

16KB
244

此仓库已废弃

此库已重命名并迁移到 wasmedge_process_interface。请跟进新的 wasmedge_process_interface 包以进行进一步开发。此仓库将不再进行开发。

SSVM进程接口

一个Rust库,为Rust到WebAssembly的开发者提供在他们的Wasm在SecondState的SSVM上执行时的运行命令功能的语法。

从高层次概述来看,我们实际上正在构建一个进程接口,将允许本地操作系统(SSVM在其中运行)在运行时执行中发挥作用。具体来说,作为Wasm执行的一部分执行带有参数和环境值的命令。

如何使用此库

Rust依赖项

开发者将 ssvm_process_interface 作为依赖项添加到他们的 Rust -> Wasm 应用程序中。例如,将以下行添加到应用程序的 Cargo.toml 文件中。

[dependencies]
ssvm_process_interface = "^0.1.3"

开发者将在他们的 Rust -> Wasm 应用程序代码中将 ssvm_process_interfaceCommand 模块引入作用域。例如,将以下代码添加到他们的 main.rs 文件顶部。

use ssvm_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

官方crate可在crates.io找到。

无运行时依赖