15

更新2:なぜこれがまだ賛成されているのかわかりません(2014年3月)。私が何年も前にこの質問をしたので、これは修正されたようです。最新バージョンのブーストを使用していることを確認してください。

更新:おそらく、数値をフォーマットするためにC ++ストリームを初期化する必要があり、共有ライブラリがPythonにロードされているときに初期化が行われていませんか?

呼んでいます

cout << 1 << "!" << endl; 

boost.pythonを介して共有ライブラリにエクスポートされるメソッド内。何も印刷されませんが、印刷すると

cout << "%" << "!" << endl; 

できます。

私はこれをしたいので、これは重要です:

ostream& operator <<(ostream &os, const Bernoulli& b) {
    ostringstream oss;
    oss << b.p() * 100.0 << "%";
    return os << oss.str();
}

私はこれを行うことによってそれを公開しました:

BOOST_PYTHON_MODULE(libdistributions)
{
    class_<Bernoulli>("Bernoulli")
        .def(init<>())
        .def(init<double>())

        .def("p", &Bernoulli::p)
        .def("set_p", &Bernoulli::set_p)
        .def("not_p", &Bernoulli::not_p)

        .def("Entropy", &Bernoulli::Entropy)
        .def("KL", &Bernoulli::KL)
        .def(self_ns::str(self))
    ;
}

しかしstr、ベルヌーイオブジェクトでPythonのメソッドを呼び出すと、何も得られません。より単純なcoutの問題が関係しているのではないかと思います。

4

3 に答える 3

3

私もしばらく前にこの問題に遭遇しました。ここでの回答に概説されているようにself_nsを使用します。BoostPythonC ++クラスに`__str__`メソッドを追加するときに問題をビルドします。

self_nsを使用する理由は、Dave自身がここで説明していますhttp://mail.python.org/pipermail/cplusplus-sig/2004-February/006496.html


デバッグのためだけに、試してみてください

inline std::string toString(const Bernoulli& b) 
{
   std::ostringstream s;
   s << b;
   return s.str(); 
}

そして.def(self_ns::str(self))

class_<Bernoulli>("Bernoulli")
[...]
.def("__str__", &toString)
于 2012-11-12T10:56:29.470 に答える
2

boost::format代わりに使ってみましたか?すでに使用しているのでboost、それほど面倒なことではありません。

boost::format( "%d%%" ) % ( b.p() * 100.0 )

std::endlもう1つ、出力に明示的に渡してみてくださいos

于 2011-01-07T14:21:12.227 に答える
0

.str()メソッドを使用する前にストリームをフラッシュしようとしましたか?

oss << b.p() * 100.0 << "%" << std::flush;
于 2011-01-11T19:55:22.710 に答える