2010-07-07 5 views
7

estoy desarrollando mi propio intérprete de código Python usando la API de Python C, tal como se describe en la documentación de Python. He echado un vistazo en el código fuente de Python y traté de seguir los mismos pasos que se llevan a cabo en el intérprete estándar al ejecutar un archivo py. Estos pasos (secuencia de llamadas a funciones API C) son básicamente:Python Embedded - El bloqueo de las operaciones en el módulo de tiempo de

PyRun_AnyFileExFlags() 
    PyRun_SimpleFileExFlags() 
    PyRun_FileExFlags() 
     PyArena_New() 
     PyParser_ASTFromFile() 
     run_mod() 
      PyAST_Compile() 
      PyEval_EvalCode() 
       PyEval_EvalCodeEx() 
        PyThreadState_GET() 
        PyFrame_New() 
        PyEval_EvalFrameEx() 

La única diferencia en mi código es que lo hago manualmente la compilación de AST, la creación del marco, etc y luego llamo PyEval_EvalFrame.

Con esto, yo soy capaz de ejecutar un archivo .py arbitraria con mi programa, como si fuera normal, el intérprete de Python. Mi problema surge cuando el código que está ejecutando mi programa hace uso del módulo de tiempo: todas las operaciones del módulo de tiempo se bloquean en el GIL. Por ejemplo, si el código de Python llama a time.sleep (1), esta llamada se bloquea y nunca se ejecuta.

Obviamente estoy haciendo algo mal que bloquea el GIL (y por lo tanto bloquea el módulo de tiempo) pero no sé cómo corregirlo. La última declaración en mi código donde tengo control está en PyEval_EvalFrameEx, y desde ese momento, todo se ejecuta "como en el intérprete de Python normal", creo.

alguien tenía un problema similar? ¿Qué estoy haciendo mal, para bloquear el módulo de tiempo? espero que alguien me puede ayudar ...

Gracias por su tiempo. Saludos cordiales,

R.

+0

I Imagine que su sueño es cuál es el bloqueo de la GIL. ¿Alguna razón convincente para ejecutar un intérprete de homebrew? – synthesizerpatel

Respuesta

1

Debe proporcionar más detalles.

  • ¿Cómo se diferencia el comportamiento de su intérprete del intérprete estándar?
  • Si solo desea ejecutar archivos fuente arbitrarios, ¿por qué no está llamando a una de las interfaces de nivel superior, como PyRun_SimpleFile? ¿Tu código llamó al Py_Initialize?
Cuestiones relacionadas