简体   繁体   中英

Attempting to send/receive over Process Pipe to python wrapper, c++ code

I have a python wrapper holding some c++ code. In it is a function that I setup as a process from my python code. Its a while statement that I need to setup a condition for when it should shut down.

For this situation , the while statement is simple.

while(TERMINATE == 0)

I have data that is being sent back from within the while loop. I'm using pipe() to create 'in' and 'out' objects. I send the 'out' object to the function when I create the process.

fxn = self.FG.do_videosequence
(self.inPipe, self.outPipe) = Pipe()
self.stream = Process(target=fxn, args=(self.outPipe,))
self.stream.start()

As I mentioned, while inside the wrapper I am able to send data back to the python script with

PyObject *send = Py_BuildValue("s", "send_bytes");
PyObject_CallMethodObjArgs(pipe, send, temp, NULL);

This works just fine. However, I'm having issues with sending a message to the C++ code, in the wrapper, that tells the loop to stop.

What I figured I would do is just check poll(), as that is what I do on the python script side. I want to keep it simple. When the system sees that there is an incoming signal from the python script it would set TERMINATE = 1. so i wrote this.

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

As I'm expecting a true or false from the python function poll(). I figured "p" would be ideal as it would convert true to 1 and false to 0.

in the loop I have

if(PyObject_CallMethodObjArgs(pipe, poll, NULL, NULL))
            TERMINATE = 1;

I wanted to use poll() as its non-blocking, like recv() is. This way I could just go about my other work and check poll() once a cycle.

however, when I send a signal from the python script it never trips.

self.inPipe.send("Hello");

I'm not sure where the disconnect is. When I print the poll() request, I get 0 the entire time. I'm either not calling it correctly, and its just defaulting to 0. or I'm not actually generating a signal to trip the poll() call. Thus its always 0.

Does anyone have any insight as what i am doing wrong?

*****UPDATE******

I found some other information.

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

should be

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

as I'm passing a string as a reference to the function im calling it should be referenced as a string. It has nothing to do with the return type.

From there the return of

PyObject_CallMethodObjArgs(pipe, poll, NULL, NULL)

is a pyobject so it needs to be checked against a pyobject. such as making a call to

PyObject_IsTrue

to determine if its true or false. I'll make changes to my code and if I have solution I'll update the post with an answer.

So I've been able to find the solution. In the end I was making two mistakes. The first mistake was when I created the pyobject reference to the python function I was calling. I mistook the information and inserted a "p" thinking before reading the context. So

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

should be

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

The second mistake was how I was handling the return value of

PyObject_CallMethodObjArgs(pipe, poll, NULL, NULL)

while its true that its calling a python object, it is not returning a simple true false value, but rather a python object. So I specificly needed to handle the python object, by calling

PyObject_IsTrue(Pyobject o)

with the return of the poll() request as the argument. I now have the ability to send/recieve from both the python script and the C api contained in the wrapper.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM