Попытка отправки / получения через Process Pipe в python оболочку, код C ++ - PullRequest
0 голосов
/ 22 января 2020

У меня есть 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

, чтобы определить, является ли оно истинным или ложным. Я внесу изменения в свой код и, если у меня будет решение, я обновлю пост ответом.

1 Ответ

0 голосов
/ 23 января 2020

Так что я смог найти решение. В конце я сделал две ошибки. Первая ошибка была при создании ссылки pyobject на функцию python, которую я вызывал. Я ошибочно принял информацию и вставил «p», прежде чем читать контекст. Таким образом,

PyObject *poll = Py_BuildValue("p", "poll");

должно быть

PyObject *poll = Py_BuildValue("s", "poll");

Вторая ошибка заключалась в том, что я обрабатывал возвращаемое значение

PyObject_CallMethodObjArgs(pipe, poll, NULL, NULL)

, в то время как это правда, что он вызывает python объект, он не возвращает простое истинное ложное значение, а скорее python объект. Поэтому мне нужно было обработать объект python, вызвав

PyObject_IsTrue(Pyobject o)

с возвращением запроса poll () в качестве аргумента. Теперь у меня есть возможность отправлять / получать как из скрипта python, так и из API C, содержащегося в оболочке.

...