我试图在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