Здравствуйте.
Подскажите пожалуйста, как можно запустить внешний процесс в интерактивном режиме (чтобы выводилось на консоль и вводить туда текст)Перерыла инет, SO, не понимаю. Все прекрасно работало пока не нужно было вводить данные с клавиатуры. Сначала работала через
process::Command::new(app) .args([execute, &args[1]]) .output() .expect("failed to execute process")
потом переписала
process::Command::new(app) .args([execute, &args[1]]) .stderr(Stdio::null()) .stdout(Stdio::piped()) .stdin(Stdio::piped()) .spawn().expect("failed to execute process")
Внешний процесс по типу как на картинке:
<…вырезанные эксперименты с API Command…>
use std::{env, fs, str};
use std::process::{Command, Stdio};
fn read_file(watch_path: &str) -> String {
let filepath: String;
let filepath_r = fs::read_to_string(watch_path);
filepath = match filepath_r {
Ok(filepath) => filepath,
Err(error) => {
panic!("Problem opening the file: {:?}", error)
}
};
return filepath;
}
fn main() {
let args: Vec<String> = env::args().collect();
let python_path = ".env";
let p = read_file(python_path);
let app: &str = if cfg!(target_os = "windows") {
&*p.trim()
} else if cfg!(target_os = "linux") {
"python3"
} else {
"python3"
};
let execute = "per_page_recognition.py";
let child = if args.len() == 1 {
Command::new(app)
.args([execute])
.stderr(Stdio::null()) // don't care about stderr
.stdout(Stdio::inherit()) // set up stdout so we can read it
.stdin(Stdio::inherit()) // set up stdin so we can write on it
.spawn()
.expect("Could not run the command") // finally run the command
} else {
Command::new(app)
.args([execute, &args[1]])
.stderr(Stdio::null()) // don't care about stderr
.stdout(Stdio::inherit()) // set up stdout so we can read it
.stdin(Stdio::inherit()) // set up stdin so we can write on it
.spawn()
.expect("Could not run the command") // finally run the command
};
let output = child.wait_with_output().expect("failed to wait on child");
let stdout = output.stdout.as_slice();
let out = str::from_utf8(&stdout).unwrap();
println!("{}", out);
}
размещу пример на своем github: GitHub - Valeria-Fadeeva/app-launcher: Программа запускает указанную в ней другую программу с параметрами, которые были в нее переданы
Цитирую на индексируемый поисковиками форум в надежде, что оно всплывет у гуглящих похожий вопрос в будущем.
при решении вопроса также гуглила про Popen в rust.
еще duct