【问题标题】:Capturing a library's printf output from the caller in OCaml从 OCaml 中的调用者捕获库的 printf 输出
【发布时间】:2015-01-22 06:52:57
【问题描述】:

我正在使用 ocaml-dns。

Here你可以看到它做

 printf "retrying query for %d times\n%!" (4-count);

它把我的日志弄得乱七八糟!我已经在处理失败,我不在乎那个输出,我想让它静音。在不分叉和修改库本身的情况下如何做到这一点?我可以以某种方式缓冲它的输出吗?

谢谢

【问题讨论】:

  • 你运气不好。除非明确告知,否则库不应输出到标准文件描述符。我提交了错误报告here

标签: dns printf ocaml opam


【解决方案1】:

如果您使用的是类 Unix 系统,您可以将标准输出重定向到“/dev/null”。这样的事情可能会起作用:

let nullout = open_out "/dev/null" in
Unix.dup2 (Unix.descr_of_out_channel nullout) Unix.stdout

这是一个显示它有效的会话(至少对我在 OS X 上):

$ ocaml
        OCaml version 4.01.0

# #load "unix.cma";;
# Sys.system "echo unwanted message";;
Error: Unbound value Sys.system
# Sys.command "echo unwanted message";;
unwanted message
- : int = 0
# let nullout = open_out "/dev/null" in
  Unix.dup2 (Unix.descr_of_out_channel nullout) Unix.stdout;;
Sys.command "echo unwanted message";;
Sys.command "echo error message >&2";;
error message

如果你需要在其他时候使用标准输出,你的问题就更糟了。我认为,您可以通过额外使用dup 将标准输出重定向回原来的位置。

【讨论】:

  • 感谢使用dup 的提示,但不幸的是,我需要能够将自己的内容写入标准输出,我只想让那个嘈杂的库静音。 Daniel Bünzli 评论了我的问题,然后在 Github 上提交了一个错误,作者说他们会修复它。
  • 如果你想通过dup 变得非常活跃,我很确定你可以做到。但是修复这个错误是非常优越的。
  • 是的,我可以在每次调用它之前重定向到 null,然后立即返回到正常输出。如果它不会对性能产生太大影响,我可能会同时这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多