7

Python のドキュメントで説明されているように、Python C API を使用して独自の Python コード インタープリターを開発しています。Python のソース コードを調べて、py ファイルを実行するときに標準のインタープリターで実行されるのと同じ手順を実行しようとしました。これらの手順 (C API 関数呼び出しのシーケンス) は、基本的に次のとおりです。

PyRun_AnyFileExFlags()
  PyRun_SimpleFileExFlags()
    PyRun_FileExFlags()
        PyArena_New()
        PyParser_ASTFromFile()
        run_mod()
            PyAST_Compile()
            PyEval_EvalCode()
                PyEval_EvalCodeEx()
                    PyThreadState_GET()
                    PyFrame_New()
                    PyEval_EvalFrameEx()

私のコードの唯一の違いは、AST コンパイル、フレーム作成などを手動で行ってから、PyEval_EvalFrame を呼び出すことです。

これにより、あたかも通常の Python インタープリターであるかのように、自分のプログラムで任意の .py ファイルを実行できます。私の問題は、私のプログラムが実行しているコードが時間モジュールを利用するときに発生します。すべての時間モジュール操作が GIL でブロックされます! たとえば、Python コードが time.sleep(1) を呼び出す場合、この呼び出しはブロックされ、実行されません。

明らかに、私はGILをブロックする(したがって時間モジュールをブロックする)何か間違ったことをしていますが、それを修正する方法がわかりません。私が制御できるコードの最後のステートメントは PyEval_EvalFrameEx にあり、その時点から、すべてが「通常の Python インタープリターのように」実行されると思います。

誰かが同様の問題を抱えていましたか?時間モジュールをブロックするために、私は何を間違っていますか? 誰かが私を助けてくれることを願っています...

御時間ありがとうございます。よろしくお願いします、

R.

4

1 に答える 1

1

詳細を提供する必要があります。

  • あなたの通訳者の振る舞いは標準的な通訳者とどのように異なりますか?
  • 任意のソース ファイルを実行したいだけなら、なぜPyRun_SimpleFileのような上位レベルのインターフェイスを呼び出さないのでしょうか? あなたのコードはPy_Initializeを呼び出しましたか?
于 2010-12-20T09:56:21.073 に答える