我正在使用 Python C API 开发自己的 Python 代码解释器,如 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。
有了这个,我可以用我的程序执行一个任意的 .py 文件,就好像它是普通的 Python 解释器一样。当我的程序正在执行的代码使用时间模块时,我的问题就出现了:所有时间模块操作都在 GIL 中被阻塞!例如,如果 Python 代码调用 time.sleep(1),则此调用将被阻止并且永远不会被执行。
显然我做错了什么会阻止 GIL(因此会阻止时间模块),但我不知道如何纠正它。我可以控制的代码中的最后一条语句在 PyEval_EvalFrameEx 中,从那时起,我认为一切都“像在常规 Python 解释器中一样”运行。
有人有类似的问题吗?我在做什么错,所以我阻止了时间模块?希望有人可以帮助我...
谢谢你的时间。此致,
R。