Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

last_error_messageではなく標準出力にエラーログを流すようにする #95

Closed
Hiroshiba opened this issue Mar 12, 2022 · 3 comments

Comments

@Hiroshiba
Copy link
Member

内容

エラーが出た後にエラーメッセージをgetする方式にしていますが、エラーログはglobal変数で管理しており、何かと不便です。
実際に使う際、エラーメッセージが見れればOKだと思うので、stderrにエラーログを流す運用に変えるissueになります。

この辺りの内容です

Pros 良くなる点

コードの見通しが立ちやすい

Cons 悪くなる点

実際に利用する際、「エラーメッセージをダイアログに表示する」等ができなくなる?

実現方法

srd:cerr

その他

ライブラリ実行時の標準エラーってキャプチャできるのでしょうか。
別プロセスを作らないと無理・・・?

@aoirint
Copy link
Member

aoirint commented Mar 12, 2022

ライブラリ実行時の標準エラーってキャプチャできるのでしょうか

Python ctypesで共有ライブラリが吐き出す標準エラー出力を抑制したことがあったので、実装例を貼っておきます。
os.devnullio.StringIOにすればキャプチャできそうではあります。

システムコールdup, dup2が呼び出せれば、ほかの言語でも同じことはできそう・・・?

# 標準出力・標準エラー出力の抑制デコレータ
def silent(verbose=False):
    def _silent(func):
        def wrapper(*args, **kwargs):
            if not verbose:
                devnull = open(os.devnull, 'w')
                stdout = os.dup(1) # stdin: 0, stdout: 1, stderr: 2
                stderr = os.dup(2)
                os.dup2(devnull.fileno(), 1)
                os.dup2(devnull.fileno(), 2)

            res = func(*args, **kwargs)

            if not verbose:
                os.dup2(stdout, 1)
                os.dup2(stderr, 2)
                devnull.close() # NOTE: closeの保証がない?

            return res

        return wrapper
    return _silent


class Network:
    def __init__(self, meta_file, cfg_file, weights_file, verbose=False):
        @silent(verbose=verbose)
        def _init():
            self.net = load_net(cfg_file.encode('ascii'), weights_file.encode('ascii'), 0) # c function (ctypes)
            self.meta = load_meta(meta_file.encode('ascii')) # c function (ctypes)

        _init()

@Hiroshiba
Copy link
Member Author

なるほどです!!
そもそもエラーログがサービスで必要になることは珍しいこと、キャプチャする方法はありそうなこと、どうしてもエラーログを得たいときは別プロセスで起動すれば良いことを考えて、エラーログはstderrに直接流すようにする設計で良いと思いました!!
@aoirint さんありがとうございます!)

@qryxip
Copy link
Member

qryxip commented Mar 24, 2024

C++からRust化した時点、というより #126 の時点で達成していると思うのでcloseします。

@qryxip qryxip closed this as completed Mar 24, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants