std::process::Command没有输出

4

我想使用process::Command运行clippy,但好像无法正常工作。

我在这个上运行了cargo build:

use std::env;
use std::process::Command;
use std::io;
use std::io::Write;

fn main() {
    let pwd = env::current_dir();
    match pwd {
        Ok(data) => {
            println!("{}", &data.display());
            let output = Command::new("cargo")
            .arg("clippy")
            .output()
            .expect("there was an error");

            io::stdout().write_all(&output.stdout).unwrap();
        },
        Err(_) => (),
    }
}

我在另一个Rust项目的根目录下执行了二进制文件,但似乎没有任何输出。我尝试使用 ls 代替 cargo clippy 运行,它可以正确列出该目录中的所有文件。有什么想法吗?


5
与大多数编译器一样,cargo clippy 只在标准错误流(stderr)中输出错误和警告,而不是标准输出流(stdout)。 - mcarton
如果您的项目涉及解析Clippy的输出,请注意您可以将其配置为以机器可读的JSON格式输出诊断信息 - Maya
1个回答

3

正如mcarton所指出的那样,cargo clippy不会将任何内容打印到标准输出(stdout)中,而是只打印到标准错误(stderr)中。因此,添加stderr的输出会打印更多文本:

use std::env;
use std::process::Command;
use std::io;
use std::io::Write;

fn main() {
    let pwd = env::current_dir();
    match pwd {
        Ok(data) => {
            println!("{}", &data.display());
            let output = Command::new("cargo")
                .arg("clippy")
                .output()
                .expect("there was an error");

            io::stdout().write_all(&output.stdout).unwrap();
            // add this line to print stderr output too
            io::stderr().write_all(&output.stderr).unwrap();
        },
        Err(_) => (),
    }
}

在上述例子中,我们将output的stderr输出写入我们应用程序的stderr。
output.stderr -> app.stderr:
io::stderr().write_all(&output.stderr).unwrap();

如果我们想将其写入标准输出,可以使用以下方法。

output.stderr -> app.stdout:

io::stdout().write_all(&output.stderr).unwrap();

这很有道理。我太专注于stdout了,忘记了stderr。谢谢。 - someone_else

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接