如何解决如何临时捕获标准输出
如何在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)
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 举报,一经查实,本站将立刻删除。