嵌入式Python - 在时间模块中阻止操作

时间:2010-07-07 16:02:51

标签: python c api time embedded-language

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

1 个答案:

答案 0 :(得分:1)

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

  • 您的口译员的行为与标准口译员有何不同?
  • 如果您只想运行任意源文件,为什么不调用其中一个更高级别的接口,例如PyRun_SimpleFile?您的代码是否致电Py_Initialize