我試圖在SBCL中運行外部程序並捕獲其輸出。 輸出是二進制數據(一個PNG圖像),而SBCL堅持把它解釋爲字符串。在Common Lisp中讀取外部程序的二進制輸出
我嘗試了許多方法,如
(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))
,但我得到這樣的錯誤
Illegal :UTF-8 character starting at byte position 0.
在我看來,那SBCL試圖解釋二進制數據作爲文本和對其進行解碼。我如何改變這種行爲?我只感興趣獲取八位字節的向量。
編輯:由於從上面的文本不清楚,我想補充說,至少在flexi-stream的情況下,流的元素類型是flexi-streams:octect
(這是一個(unsigned-byte 8)
)。 我希望至少在這種情況下run-program
讀取原始字節沒有太多問題。相反,我收到一條消息,如Don't know how to copy to stream of element-type (UNSIGNED-BYTE 8)
是的,這似乎工作,非常感謝你!無論如何,我不知道問題出在哪裏。我的意思是,使用文件流作爲輸出工作正常,所以問題不是完全在運行程序中,而是在字符串流和運行程序之間的交互。但我期望使用with-output-to-sequence可以正常工作。無論如何,至少我現在有一個解決方案。再次感謝。 – 2012-01-13 11:35:57
@MarcoRighele:在SO上,如果你關心接受一個答案,它將問題標記爲在SO系統中回答 - 這是選票按鈕的複選標記。 – 2012-01-13 16:46:47
如果正在等待查看其他解決方案是否也在工作。無論如何,我更喜歡這個,因爲它具有較少的外部依賴性。 – 2012-01-16 08:47:52