1

Pythonを(Python C APIを使用して)C ++アプリケーションに埋め込み、スローされたPython例外を、C++で既にセットアップされている例外ハンドラーメカニズムで処理できるようにします。この例外ハンドラーメカニズムは例外自体を出力するので、埋め込まれたPythonインタープリターに例外を画面に出力させたくありません。何らかの方法でコンソール出力を抑制するように組み込みPythonインタープリターをセットアップできますか?

4

2 に答える 2

4

Stub-Streamhandler を Python のstandard outstandard errorチャネルの両方にプラグインできます。

ここにサンプルがあります(両方のチャンネルを含めて取り消します):

import sys
import cStringIO

print("Silencing stdout and stderr")
_stdout = sys.stdout
_stderr = sys.stderr
sys.stdout = cStringIO.StringIO()
sys.stderr = cStringIO.StringIO()

print("This should not be printed out")

sys.stdout = _stdout
sys.stderr = _stderr

print("Revoiced stdout and stderr")

このサンプルを実行すると、次の出力が得られます。

Silencing stdout and stderr
Revoiced stdout and stderr

[更新しました]

そして、ここに送信先のメモリ節約バリアントがありますdevnull:

import os, sys
with open(os.devnull, 'w') as devnull:
    sys.stdout = devnull
    sys.stderr = devnull
    # ... here your code
于 2012-09-05T15:14:55.263 に答える
0

どのようにコードを実行しましたか? 例外が python によって直接捕捉および出力されない場合 (誰かが python にハンドラを直接インストールした場合)、例外処理に設定され、C を使用して例外を調べることができます (リファレンス マニュアルの例外処理セクションを参照してください)。

C コードから Python スクリプトを呼び出すと、呼び出し元の関数は NULL または -1 (例外が発生した) を返し、上記の API を使用して例外を読み取ることができます (例: PyErr_Occurred(),... )。

しかし、何かが Python コード自体によって行われる場合 (誰かがそのコード内にフックまたは何かをインストールし、それを直接出力した場合)、物事を簡単にキャッチするための変更はありません。コードを呼び出して、自分でフックを追加できるかもしれません。これは sys.excepthook(type, value, traceback) を介して実行できます。解決策の 1 つは、位置を見つけてコードから削除するか、他の方法を調べて回避することです。

このサイトはそれについて非常に有益です: Python API/include files

編集: stdout または stderr をリダイレクトするには、C-Api 関数を使用できます。

FILE* sto = fopen("out.txt", "w+");
FILE* ste = fopen("outErr.txt", "w+");
PySys_SetObject("stdout", PyFile_FromFile(sto, "out.txt","wb", fclose)); 
PySys_SetObject("stderr", PyFile_FromFile(ste, "outErr.txt","wb", fclose)); 

他の Python コードを呼び出す前に。PyFile_FromFile も何か他のものに置き換えられるかもしれませんが、私はこれをまだ使用していません。

于 2012-09-05T14:56:06.430 に答える