如何捕获clojure的标准输出?

时间:2011-03-29 11:25:31

标签: clojure

我需要从Clojure程序中捕获一些printlns,我想知道如何捕获输出?

我试过了:

(binding [a *out*]
    (println "h")
    a
)

:但这不起作用

3 个答案:

答案 0 :(得分:33)

(with-out-str (println "this should return as a string"))

答案 1 :(得分:7)

为了扩展Michiel的答案,当您想要将输出捕获到文件时,可以将with-out-strspit结合使用。

如果您不希望在写出来之前在内存中构建一个巨大的字符串,那么您可以使用with-out-writer库中的clojure.contrib.io

with-out-writer是一个宏,可以很好地封装文件资源的正确打开和关闭,并在执行代码时将该文件上的编写器绑定到*out*

答案 2 :(得分:3)

Michiel完全正确。由于我无法在评论的答案中添加代码,因此with-out-str涵盖的内容如此,您可以将其与您的尝试进行比较:

user=> (macroexpand-1 '(with-out-str (println "output")))
(clojure.core/let [s__4091__auto__ (new java.io.StringWriter)]
  (clojure.core/binding [clojure.core/*out* s__4091__auto__]
    (println "output")
    (clojure.core/str s__4091__auto__)))

您的代码将现有的标准输出流绑定到变量,打印到该流,然后通过变量询问流的值;但是,流的值当然不是打印到它的字节数。因此with-out-str暂时将新创建的StringWriter绑定到*out*,最后查询该临时写入者的字符串值。