我有一个包含一些 c++ 代码的 python 包装器。其中有一个函数,我从我的 python 代码中设置为一个进程。这是一个while语句,我需要设置何时应该关闭的条件。
对于这种情况,while 语句很简单。
while(TERMINATE == 0)
我有从 while 循环中发回的数据。我正在使用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++代码发送消息时遇到问题,该消息告诉循环停止。
我想我会做的只是检查 poll((,因为这就是我在 python 脚本端所做的。我想保持简单。当系统看到有来自 python 脚本的传入信号时,它会设置 TERMINATE = 1。所以我写了这个。
PyObject *poll = Py_BuildValue("p", "poll");
正如我期望从 python 函数 poll(( 中得到真或假。我认为"p"是理想的,因为它会将 true 转换为 1,将 false 转换为 0。
在我有的循环中
if(PyObject_CallMethodObjArgs(pipe, poll, NULL, NULL))
TERMINATE = 1;
我想使用 poll(( 作为它的非阻塞,就像 recv(( 一样。这样我就可以继续我的其他工作,并每周期检查一次poll((。
但是,当我从 python 脚本发送信号时,它永远不会跳闸。
self.inPipe.send("Hello");
我不确定断开连接在哪里。当我打印 poll(( 请求时,我整个时间都得到 0。我要么没有正确调用它,要么它只是默认为 0。或者我实际上并没有生成触发 poll(( 调用的信号。因此,它始终为 0。
有没有人知道我做错了什么?
*****更新******
我发现了一些其他信息。
PyObject *poll = Py_BuildValue("p", "poll");
应该是
PyObject *poll = Py_BuildValue("s", "poll");
因为我正在传递一个字符串作为对函数的引用 im 调用它应该作为字符串引用。它与返回类型无关。
从那里返回
PyObject_CallMethodObjArgs(pipe, poll, NULL, NULL)
是一个 pyobject,因此需要根据 pyobject 进行检查。 例如调用
PyObject_IsTrue
以确定其为真还是假。我将更改我的代码,如果我有解决方案,我会用答案更新帖子。
所以我已经能够找到解决方案。最后我犯了两个错误。 第一个错误是当我创建对我正在调用的 python 函数的 pyobject 引用时。我弄错了信息,在阅读上下文之前插入了一个"p"思维。所以
PyObject *poll = Py_BuildValue("p", "poll");
应该是
PyObject *poll = Py_BuildValue("s", "poll");
第二个错误是我如何处理
PyObject_CallMethodObjArgs(pipe, poll, NULL, NULL)
虽然它确实调用了一个 Python 对象,但它不是返回一个简单的 true false 值,而是返回一个 Python 对象。所以我特别需要处理 python 对象,通过调用
PyObject_IsTrue(Pyobject o)
以返回 poll(( 请求作为参数。我现在能够从包装器中包含的 python 脚本和 C API 发送/接收。