Pythonを(Python C APIを使用して)C ++アプリケーションに埋め込み、スローされたPython例外を、C++で既にセットアップされている例外ハンドラーメカニズムで処理できるようにします。この例外ハンドラーメカニズムは例外自体を出力するので、埋め込まれたPythonインタープリターに例外を画面に出力させたくありません。何らかの方法でコンソール出力を抑制するように組み込みPythonインタープリターをセットアップできますか?
2 に答える
Stub-Streamhandler を Python のstandard out
とstandard 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
どのようにコードを実行しましたか? 例外が 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 も何か他のものに置き換えられるかもしれませんが、私はこれをまだ使用していません。