2

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 を使用すると出力しません。

4

2 に答える 2

3

私は同様の問題を経験し、例のようにユーザーコマンドラインの直後に Py_Run_SimpleString を使用して "\n" (キャリッジリターン) を追加することで解決しました:

PyRun_String(line, Py_single_input, py_dict, py_dict);
PyRun_SimpleString("\n");

PyRun_String の末尾に "\n" を追加すると機能しません。PyRun_SimpleString への別個の呼び出しである必要があります

于 2012-09-21T13:16:45.120 に答える
0

まず、 のドキュメントに次のように記載されていますPyImport_AddModule

最初にモジュール ディクショナリがあるかどうかを確認し、ない場合は新しいものを作成してモジュール ディクショナリに挿入します。失敗時に例外を設定して NULL を返します。

モジュールが既に辞書にあることを最初に確認しません。

のドキュメントには、PyRun_Stringこれがあります:

コードの実行結果を Python オブジェクトとして返すか、例外が発生した場合は NULL を返します。

成功したかどうかを確認することはありません。

コードに欠けているものが他にもいくつかあります。主なポイントは、ドキュメントを読み、その内容を理解し、エラー状態などをチェックするために必要なコードを書くことだと思います...

于 2012-09-21T08:10:35.820 に答える