2010-07-07 4 views
7

Я разрабатываю свой собственный интерпретатор кода Python с использованием API Python C, как описано в документации Python. Я взглянул на исходный код Python, и я попытался выполнить те же шаги, которые выполняются в стандартном интерпретаторе при выполнении файла py. Эти шаги (последовательность вызовов функций API C) в основном:Embedded 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() 

Единственное различие в моем коде, что я делаю вручную АСТ сборник, рамки создания и т.д., а затем я называю PyEval_EvalFrame.

С этим я могу выполнить произвольный .py-файл с моей программой, как если бы это был обычный интерпретатор Python. Моя проблема возникает, когда код, который выполняет моя программа, использует модуль времени: все операции с модулем времени блокируются в GIL! Например, если код Python вызывает time.sleep (1), этот вызов блокируется и никогда не запускается.

Очевидно, что я делаю что-то неправильно, что блокирует GIL (и, следовательно, блокирует модуль времени), но я не знаю, как его исправить. Последнее утверждение в моем коде, где у меня есть элемент управления, находится в PyEval_EvalFrameEx, и с этого момента все работает «как в обычном интерпретаторе Python», я думаю.

У кого-нибудь была аналогичная проблема? Что я делаю неправильно, так что я блокирую модуль времени? Надеюсь, кто-то может мне помочь ...

Спасибо за ваше время. С уважением,

R.

+0

Я предполагаю, что ваш сон - это то, что блокирует GIL. Любые убедительные причины для запуска переводчика-доморощенного? – synthesizerpatel

ответ

1

Необходимо предоставить более подробную информацию.

  • Как поведение вашего переводчика отличается от стандартного интерпретатора?
  • Если вы просто хотите запускать произвольные исходные файлы, почему вы не вызываете один из интерфейсов более высокого уровня, например PyRun_SimpleFile? Ваш код звонил Py_Initialize?

 Смежные вопросы

  • Нет связанных вопросов^_^