7

我正在使用 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。

4

1 回答 1

1

您需要提供更多详细信息。

  • 您的口译员的行为与标准口译员有何不同?
  • 如果您只想运行任意源文件,为什么不调用更高级别的接口之一,例如PyRun_SimpleFile?您的代码是否调用了 Py_Initialize
于 2010-12-20T09:56:21.073 回答