我正在使用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上。
答案 0 :(得分:1)
您需要提供更多详细信息。