Пауза/возобновление встроенного интерпретатора Python

Есть ли возможность приостановить/возобновить работу встроенного интерпретатора python на том месте, где мне нужно? Например:

Часть псевдокода С++:

main()
{
     script = "python_script.py";
     ...

     RunScript(script); //-- python script runs till the command 'stop'
     while(true)
     {
          //... read values from some variables in python-script
          //... do some work ...
          //... write new value to some other variables in python-script
          ResumeScript(script); //-- python script resumes it's work where
                                // it was stopped. Not from begin!
     }
     ...
}

Часть псевдокода скрипта Python:

#... do some init-work
while true:
       #... do some work
       stop # - here script stops and C++-function RunScript() 
            # returns control to C++-part
       #... After calling C++-function ResumeScript 
       # the work continues from this line

Возможно ли это сделать с API Python/C?

Спасибо


person user2098753    schedule 22.02.2013    source источник


Ответы (1)


Я тоже недавно искал способ вручную «управлять» встроенным языком, и я столкнулся с этим вопросом и решил, что поделюсь потенциальным обходным путем.

Я бы реализовал «блокирующее» поведение либо через сокет, либо через какую-то систему обмена сообщениями. Вместо того, чтобы фактически останавливать весь интерпретатор Python, просто заблокируйте его, когда он ожидает, пока С++ выполнит свои оценки.

C++ запустит встроенную среду выполнения, а затем войдет в какой-то цикл, ожидающий, пока python «подаст сигнал», что он готов. Например, C++ прослушивает порт 5000, запускает python, python работает, подключается к порту 5000 на локальном хосте, затем C++ видит соединение и получает данные от python, выполняет над ним работу, затем перетасовывает данные обратно через сокет на python, где python затем получает данные и выходит из цикла блокировки.

Мне по-прежнему нужен способ полностью приостановить виртуальную среду выполнения, но в вашем случае вы можете добиться того же с помощью сокета и некоторого блокирующего поведения, которое использует сокет для координации двух фрагментов кода.

Удачи :)

EDIT: вы можете подключить эту функцию «внедрения», используемую в этом ответе, чтобы полностью остановить python. Просто измените его, чтобы, возможно, внедрить цикл ожидания.

Останов встроенного Python

person AcidTonic    schedule 12.07.2013