객체를 가져와 결과를 반환하기 전에 python으로 처리하기 위해 대기열에서 제외하는 객체 대기열이 있습니다. 나는 그것이 모두 어떻게 어울리는 지에 관해 조금 확신하지 않는다. 그러나 내가 내가 꽤 가깝다라고 생각하는 여러 가지 장소에서 모은 것에서.C++ 객체 인스턴스를 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();
};
후 나는 다음과 같습니다 부스트 파이썬 모듈 생성 :
매 33 밀리 후 나는 PyData 객체를 생성BOOST_PYTHON_MODULE(pydata) {
bp::class_<PyData>("PyData",
bp::init<
const btVector3,
std::vector<std::tuple<float, float, float>>,
std::vector<btVector3>,
std::vector<btVector3>,
float,
float
>())
.def_readonly("Torso_LV", &PyData::m_TORSO_LV)
.def_readonly("DsOsAVs", &PyData::m_DsOsAVS)
.def_readonly("RF_FORCES", &PyData::m_RF_FORCES)
.def_readonly("LF_FORCES", &PyData::m_LF_FORCES);
};
및
나는이처럼 보이는 클래스가 그것을 대기열에 넣으십시오. 이런 식으로 뭔가 :
// 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();
}
내가 다음 객체를 얻고처럼 보이는 파이썬 함수에를 보낼 수있는 큐의 대기를 해제 별도의 작업자 스레드가 : 기본적으로
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++에서 인스턴스화 된 객체를 전달할 수 있지만 함께 조각하는 방법을 모르겠습니다. 파이썬 인터프리터는 객체의 복사본을 필요로하지 않으므로 boost :: python :: ptr을 사용하고 있습니다. 파이썬 파일을 간단하고 난 그냥 객체가이 같은 콘솔에 접수를 인쇄하려면 :
def predict_on_data(data):
print("In Predict on Data")
print(data)
나는이 부스트 모듈과 통합하는 방법을 모르겠어요. 이 작업을 수행하는 올바른 방법은 무엇입니까?
initpydata() 함수를 찾을 수 없습니다. 나는 문서가 initname()과 init_module_name()을 생성한다고 말하기 때문에 자동으로 생성된다는 것을 알고있다. init_module_pydata()를 찾을 수 있습니다. 그들은 똑같은가요? init_name은 C++에서 handle_exception()에 init_module_name을 전달하는 것처럼 보입니다. (매크로를 통해) 생성 및 BOOST_PYTHON_MODULE (pydata)로 시작하는 코드 블록으로 범위를하게된다 initpydata() 함수 내 예에서 C++ 코드에서 – terminix00
{- 코드에서이 있나요? 그렇다면 거기에 있어야합니다. –