使用boost.python时c ++流有什么问题?

时间:2010-12-06 01:10:04

标签: c++ python boost-python

更新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))
    ;
}

但是当我在伯努利对象上调用python中的str方法时,我什么都没得到。我怀疑更简单的cout问题是相关的。

3 个答案:

答案 0 :(得分:1)

您是否尝试过使用boost::format?由于您已经在使用boost,因此不应该太麻烦。

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

另外,尝试将std::endl显式传递给输出os

答案 1 :(得分:1)

我之前也遇到过这个问题,使用了这里的答案中概述的self_ns Build problems when adding `__str__` method to Boost Python C++ class

戴夫自己在http://mail.python.org/pipermail/cplusplus-sig/2004-February/006496.html

解释了使用self_ns的原因

只是为了调试,请尝试

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)

答案 2 :(得分:0)

您是否尝试在使用.str()方法之前刷新流?

oss << b.p() * 100.0 << "%" << std::flush;