#process #command #stdin #interface #running #syntax

rust_process_interface_library

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

5 个版本

0.1.4 2020年10月19日
0.1.3 2020年9月28日
0.1.2 2020年9月9日
0.1.1 2020年9月9日
0.1.0 2020年9月1日

#165 in #stdin

自定义许可证

16KB
244

此仓库已弃用

库名已更改为 ssvm_process_interface

请关注新的 crate 以获取未来版本。

Rust Process Interface Library

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

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

如何使用此库

Rust 依赖项

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

[dependencies]
rust_process_interface_library = "^0.1.3"

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

use rust_process_interface_library::Command;

使用程序名称执行命令

开发者可以使用如下语法执行命令,例如使用 std::process::Command。编译后,输出目标 Wasm 文件将包含有关运行外部命令的宿主函数导入。

创建 Command 对象

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 上找到。

无运行时依赖