C++ で Python ターミナル GUI を作成しています。次のコードを使用して、ユーザーが入力した Python コマンドラインを実行しています。
void RunTerminalCommand (char * line)
{
PyObject *py_main, *py_dict;
py_main = PyImport_AddModule("__main__");
py_dict = PyModule_GetDict(py_main);
PyObject * PyRes = PyRun_String(line, Py_single_input, py_dict, py_dict);
return 0;
}
コマンドラインが実行され、結果が標準出力を介して出力ウィンドウに出力されるため、非常にうまく機能します。しかし、Python コマンド ラインで Python エラーが発生するたびに、動作が停止します: My stdout does not receive any data
ノート:
エラー行が挿入される前であっても、PyRes は常に NULL を返します。
毎回 PyImport_AddModule を呼び出す必要があるかどうかわかりません。しかし、それはこのように機能するようです。
PyRun_String(line, Py_single_input, py_dict, py_dict)の代わりにPyRun_SimpleString(line)を使用すると、常に機能し、stdout/stderr 経由でエラー メッセージが表示されます。しかし、この呼び出しはコマンドライン評価の結果を stdout に送信しないため、使用したくありません。たとえば、コマンド ライン "2+2" は、PyRun_String を使用すると stdout に "4" を出力しますが、PyRun_SimpleString を使用すると出力しません。