У меня есть python оболочка, содержащая некоторый код C ++. В нем есть функция, которую я настроил как процесс из моего python кода. Это оператор while, который мне нужен для установки условия, когда он должен завершиться.
В этой ситуации оператор while прост.
while(TERMINATE == 0)
У меня есть данные, которые отправляются обратно в то время как l oop. Я использую pipe () для создания объектов "in" и "out". Я отправляю объект 'out' в функцию при создании процесса.
fxn = self.FG.do_videosequence
(self.inPipe, self.outPipe) = Pipe()
self.stream = Process(target=fxn, args=(self.outPipe,))
self.stream.start()
Как я уже упоминал, находясь внутри оболочки, я могу отправить данные обратно в сценарий python с помощью
PyObject *send = Py_BuildValue("s", "send_bytes");
PyObject_CallMethodObjArgs(pipe, send, temp, NULL);
Это работает просто отлично. Тем не менее, у меня возникают проблемы с отправкой сообщения в код C ++, в обертке, который говорит l oop остановиться.
Я решил, что я бы просто сделал check poll (), так как это то, что я делаю на стороне сценария python. Я хочу, чтобы все было просто. Когда система видит поступающий сигнал из сценария python, она устанавливает TERMINATE = 1., поэтому я написал это.
PyObject *poll = Py_BuildValue("p", "poll");
Поскольку я ожидаю истину или ложь от python функция poll (). Я подумал, что "p" будет идеальным, поскольку он будет преобразовывать true в 1 и false в 0.
в l oop У меня есть
if(PyObject_CallMethodObjArgs(pipe, poll, NULL, NULL))
TERMINATE = 1;
Я хотел использовать poll () как его неблокирующая, как recv (). Таким образом, я мог бы просто go о своей другой работе и проверять poll () один раз за цикл.
однако, когда я посылаю сигнал из сценария python, он никогда не отключается.
self.inPipe.send("Hello");
Я не уверен, где отключение. Когда я печатаю запрос poll (), я получаю 0 все время. Я либо неправильно его вызываю, и по умолчанию он равен 0. Или я на самом деле не генерирую сигнал для отключения вызова poll (). Таким образом, это всегда 0.
У кого-нибудь есть понимание того, что я делаю неправильно?
***** ОБНОВЛЕНИЕ ******
Я нашел некоторые другая информация.
PyObject *poll = Py_BuildValue("p", "poll");
должно быть
PyObject *poll = Py_BuildValue("s", "poll");
, так как я передаю строку как ссылку на функцию, которую я вызываю, на нее следует ссылаться как на строку. Это не имеет ничего общего с типом возвращаемого значения.
Оттуда возвращение
PyObject_CallMethodObjArgs(pipe, poll, NULL, NULL)
является пиобъектом, поэтому его необходимо проверить по пиобъекту. например, позвонив по номеру
PyObject_IsTrue
, чтобы определить, является ли оно истинным или ложным. Я внесу изменения в свой код и, если у меня будет решение, я обновлю пост ответом.