У меня есть программа, которая принимает fd к каналу в качестве аргумента. Для упрощения я моделирую программу python следующим образом:
src/test.py
#!/usr/bin/python3
import os
import sys
fd = int(sys.argv[1])
print("fd:", fd)
r = os.fdopen(fd, 'r')
print("pipe content: ", r.read())
Я создаю трубу и передаю fd следующим образом
src/main.rs
use std::io::Write;
use std::os::unix::io::IntoRawFd;
fn main() {
let (pipe_reader, mut pipe_writer) = os_pipe::pipe().unwrap();
write!(pipe_writer, "write content").unwrap();
let out = std::process::Command::new("./src/test.py")
.arg(pipe_reader.into_raw_fd().to_string())
.output()
.unwrap();
println!(
"STDOUT: {}\nSTDERR: {}",
String::from_utf8_lossy(&out.stdout),
String::from_utf8_lossy(&out.stderr)
);
}
Существует fd, поскольку "STDOUT: fd: 3" get напечатано python. Тем не менее, python ошибки с "OSError: [Errno 9] Bad дескриптор файла"
Что не так с моим кодом?