What's this?
pythonでimportしたライブラリがデバッグメッセージを標準出力に撒き散らして困ったときのad hocな対処方法です。
コード
import os
# 前処理
fd_null=os.open('/dev/null',os.O_WRONLY) # /dev/nullをwrite onlyでopenし,ファイルディスクリプタを取得
fd_stdout_bak=os.dup(1) # stdout(fd=1)を複製して退避
os.dup2(fd_null,1) # /dev/nullのファイルディスクリプタをstdoutに複製 (stdoutを/dev/nullへリダイレクト)
os.close(fd_null) # 元の/dev/nullのファイルディスクリプタは使わないので閉じる
# ここで標準出力を汚す困ったちゃんを呼び出す
# pcd=open3d.io.read_point_cloud(filename)
# 後始末
os.dup2(fd_stdout_bak,1) # 退避しておいたstdoutを元に戻す
os.close(fd_stdout_bak) # stdoutの複製を閉じる
何やってるの?
標準出力を一時的に/dev/nullにリダイレクトして出力を捨てているだけです。
/dev/nullが存在しないOSでは動きません。未確認ですがWindowsでは代わりにNULデバイスを開けばいいような気がします。
他の言語でもファイルディスクリプタをいじることができれば,ほぼ同じ手順で困ったちゃんを黙らせることが可能です。
ちゃんとした対処方法は?
なにかの拍子に後始末がすっぽ抜けると,意図したprint()
の出力まで捨てられて悲しい思いをします。try: ... finally:
でくくってやるか,with
構文を使えるようにクラス化するのが良さそうです。
しかしながら,そもそもライブラリが標準出力にデバッグメッセージを吐いていることが問題なので,issueを上げ,可能ならパッチなりPRなりを送りつけるべきでしょう。