Actualización 2: No estoy seguro de por qué esto todavía se está votando (marzo de 2014). Esto parece ser fijo ya que hice esta pregunta hace muchos años. Asegúrate de estar usando una versión reciente de boost.¿Qué hay de malo en las transmisiones de C++ cuando se utiliza boost.python?
ACTUALIZACIÓN: ¿Quizás las secuencias de C++ deben inicializarse para formatear números, y la inicialización no ocurre cuando la biblioteca compartida se carga en Python?
Estoy llamando
cout << 1 << "!" << endl;
en un método que se exporta a través de una biblioteca compartida Boost.Python. No imprime nada, pero si lo hago
cout << "%" << "!" << endl;
funciona.
Esto es importante porque quiero hacer esto:
ostream& operator <<(ostream &os, const Bernoulli& b) {
ostringstream oss;
oss << b.p() * 100.0 << "%";
return os << oss.str();
}
expuse que al hacer esto:
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))
;
}
pero cuando llamo el método str
en pitón en un objeto de Bernoulli, que no obtener nada Sospecho que el problema de cout más simple está relacionado.
No he tenido un problema con iostreams y Boost.Python ... tal vez el problema proviene de un error más sutil? Sin embargo, la técnica en los documentos (http://1dl.us/dAD) no funcionó para mí, tuve que escribir '.def (" __ str__ ", & print_wrapper)'. ¿Qué es 'self_ns' ?. Además, en su método, ¿por qué no simplemente '{return os << b.p() * 100.0 <<"% "; } '? –
rafak
@rafak la razón para hacerlo a través de ostringstream se explica en esta pregunta: http://stackoverflow.com/questions/2249018/using-setw-with-user-defined-ostream-operators –
@rafak donde se define 'print_wrapper' ? No puedo encontrarlo en el impulso. –