为了得到一个对象并在返回结果之前用python处理它,我有一个对象队列。我有点不确定它是如何结合在一起的,但从我从各个地方收集的资料来看,我觉得我已经很接近了。在
我有一节课是这样的:
class PyData
{
public:
PyData(
const btVector3 &TORSO_LV,
std::vector<std::tuple<float, float, float>> DsOsAVs,
std::vector<btVector3> RF_FORCES,
std::vector<btVector3> LF_FORCES,
float slope,
float compliance
);
std::tuple<float, float, float> m_TORSO_LV;
std::vector<std::tuple<float, float, float>> m_DsOsAVS;
std::vector<std::tuple<float, float, float>> m_RF_FORCES;
std::vector<std::tuple<float, float, float>> m_LF_FORCES;
float m_slope;
float m_compliance;
~PyData();
};
然后我创建了一个boost python模块,如下所示:
^{pr2}$每隔33毫秒,我创建一个PyData对象并将其放入队列中。像这样:
// Check the sample clock for sampling
if (m_sampleClock.getTimeMilliseconds() > 33) {
if (ContactManager::GetInstance().m_beingUsed) {
PyData dat = BuildPyData();
if (dat.m_compliance != 0.0f) {
std::unique_lock <std::mutex> l(m_mutex);
m_data.push_front(dat);
m_NotEmptyCV.notify_one();
l.unlock();
}
}
m_sampleClock.reset();
}
然后,我有一个单独的工作线程,该线程将队列出列以获取对象并将其发送到一个python函数,该函数如下所示:
void ContactLearningApp::PythonWorkerThread() {
printf("Start Python thread. \n");
bp::object f = m_interface.attr("predict_on_data");
while (true) {
//printf("Inside while loop and waiting. \n");
std::unique_lock<std::mutex> ul(m_mutex);
while (m_data.size() <= 0) {
m_NotEmptyCV.wait(ul);
}
PyData dat = m_data.back();
m_data.pop_back();
f(boost::python::ptr(&dat));
ul.unlock();
//m_ProcessedCV.notify_one();
//bp::exec("print ('Hello from boost')", m_main_namespace);
}
}
基本上,我试图传递一个用c++实例化的对象作为python参数,但是我不知道如何将它拼凑在一起。python解释器不需要对象的副本,所以我使用boost::python::ptr。 python文件很简单,我只想将接收到的对象打印到控制台上,如下所示:
def predict_on_data(data):
print("In Predict on Data")
print(data)
我不确定这是如何与增压模块集成的。正确的方法是什么?在
我已经编写了一些基于PyData数据对象的示例代码;这段代码使用boost::python数据结构(tuple和list)来与python交换数据,因为这是它们的预期用途,但是可以根据需要将数据从std::tuple和std::vector复制到它们中来填充这些数据。在
这适用于Python2.7和boost 1.53。希望您可以使用它来帮助;NB Py_initialize()之后需要调用initpydata()(生成的函数)。在
C++代码:
Python代码(本例中为Python2.py文件):
^{pr2}$一旦运行,输出如下:
希望这是有用的。在
相关问题 更多 >
编程相关推荐