Как запустить внешний процесс в интерактивном режиме

@Valeria_Fadeeva в телеграме:

Здравствуйте.
Подскажите пожалуйста, как можно запустить внешний процесс в интерактивном режиме (чтобы выводилось на консоль и вводить туда текст)

Перерыла инет, 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")

Внешний процесс по типу как на картинке:

image

<…вырезанные эксперименты с API Command…>

@Valeria_Fadeeva в телеграме:

Готово. Заработало как надо

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