1

我正在运行一堆功能。他们每个人都会向标准输出输出大量文本,这使我无法快速检查结果。有什么简单的方法可以停止输出到标准输出通道吗?谢谢

4

2 回答 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 putsfcopy)

我建议创建一个新的安全 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 回答