我正在运行一堆功能。他们每个人都会向标准输出输出大量文本,这使我无法快速检查结果。有什么简单的方法可以停止输出到标准输出通道吗?谢谢
问问题
2302 次
2 回答
2
如果函数只是为了记录目的而写入标准输出,并且您想丢弃所有这些东西,并且它们不想写入磁盘或套接字或任何其他类型的通道,那么最简单的方法是:
rename puts original_puts
proc puts args {} ;# A do-nothing procedure!
要转换回正常操作:
rename puts {}
rename original_puts puts
请注意,如果包装代码中有错误,除非您小心,否则这将导致问题。这是一个包装好的“小心”版本(用于 Tcl 8.5):
proc replacement_puts args {}
proc silentEval {script} {
rename puts original_puts
interp alias {} puts {} replacement_puts
catch [list uplevel 1 $script] msg opts
rename puts {}
rename original_puts puts
return -options $opts $msg
}
然后你就这样做:
silentEval {
call-noisy-function-A
call-noisy-function-B
...
}
如果您有想要写入文件(或套接字或......)的代码,那么可以通过更复杂的代码replacement_puts
(它总是可以使用original_puts
来完成肮脏的工作)。
如果这些函数是从 C 级别写入标准输出,那么你会更加卡住。您可以close stdout;open /dev/null
将文件描述符定向到接收器,但您无法轻松地从中恢复。(dup
如果有必要,TclX 包中有一个。)如果可以,请先尝试上面的简单版本。
于 2012-07-03T09:40:31.377 回答
0
防止输出到 stdout/stderr 的唯一好方法是(以某种方式)从您正在执行脚本的解释器中删除 stdout/stderr 通道,因为有很多方法可以将内容写入通道(包括但不包括限于puts
,chan puts
和fcopy
)
我建议创建一个新的安全 interp 并将通道传输到此 interp,调用脚本,然后将通道传输回来。之后,您可以选择删除 interp 或将其重新用于类似目的。
proc silentEval {script} {
set i [interp create -safe]
interp transfer {} stdout $i
catch [list uplevel 1 $script] msg opts
interp transfer $i stdout {}
interp delete $i
dict incr $opts -level
return -options $opts $msg
}
于 2012-07-07T15:05:28.903 回答