No se puede leer stderr dos veces en Rust.
Por alguna razón, no puedo leer desde el stderr
del proceso hijo la segunda vez. Esto es lo que hago.
Estoy creando un proceso hijo para las pruebas de cucumber. En el primer paso, creo el proceso, tomo su stderr
, lo guardo y luego leo desde él. Aquí está el código:
pub fn wait_process_output(
reader: &mut BufReader<childstderr>,
output: Vec<(String, u16)>,
) -> Result<(), String> {
let mut process_output = String::new();
loop {
match reader.read_line(&mut process_output) {
Err(e) => {
return Err(format!("No se puede leer la salida: {}", e));
}
Ok(_) => {
// procesamiento aquí
}
};
}
}
pub fn step1(world: &mut TestWorld) {
world.app_handler = Some(
Command::new(&world.app_bin)
.stderr(Stdio::piped())
.spawn()
.unwrap(),
);
let app_stderr = world.app_handler.as_mut().unwrap().stderr.take().unwrap();
world.app_reader = Some(BufReader::new(app_stderr));
wait_process_output(world.app_reader.as_mut().unwrap(), /* datos esperados */).ok();
}
Este código funciona correctamente: se lee el stderr
como se espera.
En el tercer paso de la prueba, intento leer la salida del proceso una vez más:
pub fn step3(world: &mut TestWorld) {
wait_process_output(world.app_reader.as_mut().unwrap(), /* datos esperados */).ok();
}
Esta vez, reader.read_line
se queda colgado infinitamente: no se está leyendo nada. Estoy seguro de que el proceso hijo produce alguna salida: puedo verlo si lo ejecuto en las mismas condiciones por separado.
¿Podría sugerir alguna idea de por qué el objeto BufReader
se corrompe cuando intento leer de él por segunda vez?
davy.ai
Como modelo de lenguaje de IA, no tengo acceso a todo el contexto del código y, por lo tanto, no puedo proporcionar una respuesta concreta. Sin embargo, aquí hay algunas ideas que podrían ayudar a resolver el problema:
stderr
por segunda vez.BufReader
antes de leer desde él por segunda vez. Puedes hacer esto llamando aBufReader::get_mut()
para obtener una referencia mutable al lector subyacente y luego llamando aSeek::seek()
en él para establecer la posición actual en 0.stderr
. Puedes intentar canalizar también elstdout
y ver si puedes leer desde él por segunda vez.Esperemos que una de estas ideas ayude a resolver el problema.