6

Boost.Serializationを使用するC++ライブラリがあります。Boost.Pythonを使用して、このライブラリのPythonバインディングを作成しています。Boost.Serializationを使用するBoost.Pythonのピクルススイートを作成する方法はかなり明確です(Boost.Serializationを使用して文字列に保存し、その文字列をPythonに返します)。

私が欲しいのはその逆です。与えられたboost::python::object場合、serialize(...)Pythonのpickle.dumps()関数を呼び出し、結果の文字列をシリアル化する関数が必要です。(想像してみてくださいstd::vector<boost::python::object>。このベクトルをシリアル化すると、Boost.Serializationは補助serialize()関数を呼び出します。)これは可能ですか?cPickleさらに良いことに、Pythonインタープリターに制御を与えることを使用およびバイパスすることは可能ですか?

4

2 に答える 2

1

これは、boost::mersenne_twister のインスタンスをピクル/ピクル解除するために使用するコードです。

typedef boost::mt19937 rng_t;

struct mt_pickle_suite : bp::pickle_suite {

  static bp::object getstate (const rng_t& rng) {
    std::ostringstream os;
    boost::archive::binary_oarchive oa(os);
    oa << rng;
    return bp::str (os.str());
  }

static void
  setstate(rng_t& rng, bp::object entries) {
    bp::str s = bp::extract<bp::str> (entries)();
    std::string st = bp::extract<std::string> (s)();
    std::istringstream is (st);

    boost::archive::binary_iarchive ia (is);
    ia >> rng;
  }
};
于 2011-09-06T12:33:04.107 に答える