Sto tentando di eseguire un programma esterno in SBCL e di acquisire l'output. L'output è dati binari (un'immagine png), mentre SBCL insiste a interpretarlo come stringhe.Lettura dell'uscita binaria di un programma esterno in Common Lisp
Ho provato un certo numero di modi, come
(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))
ma ricevo errori come
Illegal :UTF-8 character starting at byte position 0.
Mi sembra che SBCL sta cercando di interpretare i dati binari come un testo e decodificarlo . Come cambio questo comportamento? Mi interessa solo ottenere un vettore di ottetti.
Edit: Dato che non è chiaro dal testo di cui sopra, vorrei aggiungere che, almeno nel caso di flexi-stream, l'elemento-tipo del torrente è un flexi-streams:octect
(che è un (unsigned-byte 8)
). Mi aspetterei almeno in questo caso run-program
di leggere i byte non elaborati senza molti problemi. Invece ricevo un messaggio come Don't know how to copy to stream of element-type (UNSIGNED-BYTE 8)
Sì, questo sembra funzionare, grazie mille! In ogni caso non sono sicuro di dove si trova il problema. Voglio dire, usare un flusso di file come output funziona bene, quindi il problema non è interamente nel programma di esecuzione, ma piuttosto nell'interazione tra un flusso di stringhe e un programma di esecuzione. Ma mi aspetterei che l'uso di con output-to-sequence funzionerebbe correttamente. Almeno ora ho una soluzione ora. Grazie ancora. –
@MarcoRighele: su SO, se si cura di accettare una risposta, segna la domanda come risposta nel sistema SO - è il segno di spunta dai pulsanti di voto. –
Se era in attesa di vedere se anche l'altra soluzione funzionava. In ogni caso preferisco questo perché ha meno dipendenze esterne. –