オブジェクトを取得して結果を返す前に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();
};
をしてから、私はこのようになりますブーストのpythonモジュールを作成:私はPyDataオブジェクトを作成し、すべての33ミリ秒後
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();
}
は、私は、オブジェクトを取得し、ように見えるの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);
}
}
を、私がしようとしていますPythonの引数としてC++でインスタンス化されたオブジェクトを渡すことができますが、どのように一緒に分割するのか分かりません。私はboost :: python :: ptrを使用しているので、Pythonインタプリタはオブジェクトのコピーを必要としません。このようなコンソール上で受信 Pythonのファイルはシンプルで、私はちょうどオブジェクトを印刷したい:
def predict_on_data(data):
print("In Predict on Data")
print(data)
私は、これはブーストモジュールと統合するかどうかはわかりません。これを行う正しい方法は何でしょうか?
initpydata()関数が見つかりません。私は、ドキュメントがinitname()とinit_module_name()を生成するので、自動的に生成されることを知っています。私はinit_module_pydata()を見つけることができます。彼らは同じことですか? init_nameは、init_module_nameをC++のhandle_exception()に渡すだけです。 – terminix00
私の例のC++コードでは、initpydata()関数が(マクロを介して)作成され、BOOST_PYTHON_MODULE(pydata)で始まるコードブロックによってスコープに持ち込まれます。もしそうなら、それはそこにあるはずです。 –