1

私はたくさんの機能を実行しています。それぞれが大量のテキストを stdout に出力するため、結果をすばやく確認できません。stdout チャネルへの出力を停止する簡単な方法はありますか? ありがとう

4

2 に答える 2

2

関数がロギング目的で stdout に書き込むだけで、そのすべてを破棄したい場合、およびディスクやソケット、その他の種類のチャネルに書き込みたくない場合、最も簡単な方法は次のとおりです。

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 レベルから stdout に書き込んでいる場合は、さらに行き詰まります。ファイル記述子をシンクに向けることはできますclose stdout;open /dev/nullが、そこから簡単に回復することはできません。(dup必要な場合は、TclX パッケージに含まれています。) 可能であれば、最初に上記の単純なバージョンを試してください。

于 2012-07-03T09:40:31.377 に答える
0

stdout/stderr への出力を防止する唯一の良い方法は、スクリプトを実行しているインタープリターから stdout/stderr チャネルを (何らかの方法で) 削除することです。putschan 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 に答える