LoginSignup
1
0

More than 3 years have passed since last update.

Pythonで外部ライブラリが標準出力に吐くメッセージを抑制する

Last updated at Posted at 2021-02-03

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なりを送りつけるべきでしょう。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0