微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何临时捕获标准输出

如何解决如何临时捕获标准输出

如何在Nim中临时捕获标准输出

我想要一个带有以下签名的模板:

template captureStdout(ident: untyped,body: untyped) = discard

代码main.nim)运行无误:

var msg = "hello"
echo msg & "1"
var s: string
captureStdout(s):
  echo msg & "2"
  msg = "Ciao"
echo msg & "3"
assert s == "hello2\n"

输出应为:

hello1
Ciao3

目前的努力

目前,我可以使用临时文件捕获stdout,但无法释放回stdout。我通过以下方式做到这一点:

template captureStdout*(ident: untyped,body: untyped) =
  discard reopen(stdout,tmpFile,fmWrite)
  body
  ident = readFile(tmpFile)

与此main.nim一起运行时没有断言错误,但仅输出

hello1

在tmpFile中,我看到:

hello2
Ciao3

解决方法

调用reopen时,会将变量stdout重新分配给写入File的{​​{1}}。

为了将输出打印到系统STDOUT,需要将变量tmpFile重新分配给写入到systel STDOUT的stdout

因此,答案在Linux和Windows之间是不同的。

对于Linux,执行此操作的方法是使用dup和dup2 C函数来复制File文件描述符并使用其他文件(以便可以还原stdout)。 由于dup和dup2不在Nim的stdout中,因此我们需要绑定到system/io

这是一个例子:

unistd.h

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。