Estoy intentando ejecutar un programa externo en SBCL y capturar su salida. El resultado es datos binarios (una imagen png), mientras que SBCL insiste en interpretarlo como cadenas.Lectura de la salida binaria de un programa externo en Common Lisp
He intentado un número de maneras, como
(trivial-shell:shell-command "/path/to/png-generator" :input "some input")
(with-input-from-string (input "some input")
(with-output-to-string (output)
(run-program "/path/to/png-generator"() :input input :output output))
(with-input-from-string (input "some input")
(flexi-streams:with-output-to-sequence (output)
(run-program "/path/to/png-generator"() :input input :output output))
Pero tengo errores como
Illegal :UTF-8 character starting at byte position 0.
Me parece que SBCL está tratando de interpretar los datos binarios como texto y decodificarlo . ¿Cómo cambio este comportamiento? Estoy interesado solo en obtener un vector de octetos.
Editar: Dado que no está claro en el texto anterior, me gustaría añadir que al menos en el caso de flexi-stream, el elemento-tipo de la secuencia es un flexi-streams:octect
(que es un (unsigned-byte 8)
). Esperaría que al menos en este caso run-program
lea los bytes sin procesar sin muchos problemas. En cambio me sale un mensaje como Don't know how to copy to stream of element-type (UNSIGNED-BYTE 8)
Sí, parece que funciona, ¡muchas gracias! En cualquier caso, no estoy seguro de dónde radica el problema. Quiero decir, usar una secuencia de archivos como salida funciona bien, por lo que el problema no está completamente en el programa de ejecución, sino más bien en la interacción entre una cadena de ejecución y ejecutar el programa. Pero yo esperaría que usar with-output-to-sequence funcionaría bien. De todos modos al menos tengo una solución ahora. Gracias de nuevo. –
@MarcoRighele: en SO, si desea aceptar una respuesta, marca la pregunta como respondida en el sistema SO - es la marca de verificación de los botones de votación. –
Si estaba esperando para ver si la otra solución también estaba funcionando. En cualquier caso, prefiero este ya que tiene menos dependencias externas. –