Embedded Python - блокировка операций во временном модуле - PullRequest
7 голосов
/ 07 июля 2010

Я разрабатываю свой собственный интерпретатор кода Python с использованием Python C API, как описано в документации по 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 Ответ

1 голос
/ 20 декабря 2010

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

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