#subprocess #stdout #process #child #stdio #events

subprocess-communicate

提供类似于 Python 的 subprocess.Popen.communicate 的通信原语,允许将输入呈现给进程,并从 stdout 和 stderr 捕获结果,直到可选的界限

3 个不稳定版本

使用旧的 Rust 2015

0.2.2 2016年11月14日
0.2.1 2016年6月1日
0.1.0 2016年5月31日

#subprocess 中排名 #28

BSD-3-Clause

20KB
451

#subprocess-communicate 构建状态

项目要求

该包应该提供一个类似于 Python 的 subprocess.communicate 接口,用于与子进程通信。

传递一个输入 u8 切片,结果应该有两个 Vec,一个用于 stdout,一个用于 stderr。如果子进程的管道无法更改为非阻塞模式,或者事件循环无法激活,则可能会返回错误。

与 Python 接口不同,此接口还支持两个可选参数,分别用于限制 stdout 和 stderr 的最大输出大小。这是为了防止像 /usr/bin/yes 这样的进程消耗所有系统内存,并且有助于推理最大资源消耗。

用法

    let process =
           Command::new("/bin/cat")
           .stdin(Stdio::piped())
           .stdout(Stdio::piped())
           .stderr(Stdio::piped())
           .spawn().unwrap();
     let (ret_stdout, ret_stderr, err) = subprocess_communicate::subprocess_communicate(process, // child subprocess
                                                                                        &TEST_DATA[..], // stdin input
                                                                                        Some(TEST_DATA.len()), // stdout bound
                                                                                        None); // stderr bound (if any)
     err.unwrap();
     assert_eq!(TEST_DATA.len() - 1, ret_stdout.len());
     assert_eq!(0usize, ret_stderr.len());
     let mut i : usize = 0;
     for item in TEST_DATA[0..TEST_DATA.len()].iter() {
         assert_eq!(*item, ret_stdout[i]);
         i += 1;
     }

依赖关系

~0.6–1MB
~14K SLoC