Как выполнить команду в подоболочке в Rust?

В Python я мог бы сделать os.system("pip install bs4"). Есть ли аналог в Rust? Я видел std::process::Command, но это, кажется, каждый раз терпит неудачу:

use std::process::Command;
Command::new("pip")
    .arg("install")
    .arg("bs4")
    .spawn()
    .expect("pip failed");

Есть ли способ заставить код выполнять настоящую оболочку и запускать их в терминале?


person Rickard Martensson    schedule 28.01.2020    source источник
comment
Можете ли вы привести пример отказа, который вы получаете?   -  person effect    schedule 28.01.2020


Ответы (1)


Pip требует прав суперпользователя, поэтому обязательно запускайте свой двоичный файл с достаточными привилегиями.

Для меня работало следующее:

use std::process::Command;
Command::new("pip")
    .args(&["install", "bs4"])
    .spawn()
    .expect("failed to execute process");

Используйте это для анализа сбоя:

use std::process::Command;
let output = Command::new("pip")
    .args(&["install", "bs4"])
    .output()
    .expect("failed to execute process");

println!("status: {}", output.status);
println!("stdout: {}", String::from_utf8_lossy(&output.stdout));
println!("stderr: {}", String::from_utf8_lossy(&output.stderr));

Пример взят отсюда:

Как вызвать систему команду в Rust и захватить ее вывод?

person Iron Oxidizer    schedule 28.01.2020
comment
Вы никогда не должны использовать pip как root. Настройте venv или используйте pip install --user - person mcarton; 29.01.2020