26

Python インタープリターを C プログラムに埋め込んでいます。ただし、一部の python スクリプトをPyRun_SimpleString()実行しているときに、無限ループに陥ったり、長時間実行されたりすることがあります。PyRun_SimpleString("while 1: pass");メインプログラムがブロックされるのを防ぐために、インタープリターをスレッドで実行できると考えました。

プロセス全体を強制終了せずに、スレッドで実行されている組み込みインタープリターで python スクリプトの実行を停止するにはどうすればよいですか?

インタプリタに例外を渡すことは可能ですか? シグナルをリッスンする他のスクリプトの下にスクリプトをラップする必要がありますか?

PS: Python を別のプロセスで実行することもできますが、これは私が望むものではありません - それが最後の手段でない限り...


アップデート:

だから、それは今動作します。デニス・オトキダッハ、もう一度ありがとう!

これが正しければ、2 つのことを行う必要があります。インタープリターに停止するように指示しreturn -1、PyRun_SimpleString() が実行されているのと同じスレッドで実行します。

停止するには、いくつかの可能性があります:PyErr_SetString(PyExc_KeyboardInterrupt, "...")またはPyErr_SetInterrupt()- 最初の方法では、Python がさらにいくつかの命令を実行したままにしてから停止し、後の方法ではすぐに実行を停止します。

Python の実行に関数呼び出しを挿入するためreturn -1に使用します。Py_AddPendingCall()ドキュメントではバージョン 2.7 および 3.1 以降で言及されていますが、以前の Python でも動作します (ここでは 2.6)。2.7 と 3.1 からは、スレッドセーフでもあるはずです。つまり、GIL を取得せずに呼び出すことができます (?)。

したがって、次の例を書き直すことができます。

int quit() {
    PyErr_SetInterrupt();
    return -1;
}
4

3 に答える 3

1

さて、Pythonインタープリターは、埋め込みプログラムとは別のスレッドで実行する必要があります。そうしないと、インタープリターに割り込む機会がまったくありません。

それがある場合、おそらくPython API例外呼び出しの1つを使用して、インタープリターで例外をトリガーできますか?PythonCAPIの例外を参照してください

于 2009-09-14T11:40:22.153 に答える