2010-07-07 36 views
7

我正在使用Python C API開發我自己的Python代碼解釋器,如Python文檔中所述。我看了一下Python源代碼,並試圖執行在執行py文件時在標準解釋器中執行的相同步驟。這些步驟(的C API函數調用序列)基本上是:嵌入式Python - 在時間模塊中阻塞操作

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

我想你的睡眠是什麼阻止GIL。有什麼令人信服的理由來運作自制翻譯? – synthesizerpatel 2010-12-07 13:05:51

回答

1

您需要提供更多的細節。

  • 你的口譯員的行爲與標準口譯員有什麼不同?
  • 如果你只是想運行任意源文件,爲什麼你不打電話給更高層次的接口之一,如PyRun_SimpleFile?您的代碼是否撥打Py_Initialize