|
Boost Users : |
Subject: Re: [Boost-users] (Boost.Python) How to print from C++ to the same stream as Python's 'print' does?
From: Dietrich Bollmann (diresu_at_[hidden])
Date: 2009-05-14 10:35:41
Hi Christopher and Early,
...I thought there is some standard Boost.Python stream somewhere anyway
and didn't expect this kind of solution :)
The code became longer than before (at least when calculating the
definition of the sink class also) - but much more elegant :)
Before:
std::ostringstream oss;
oss << "Hello, Python world!" << std::endl;
std::string cs = oss.str();
PySys_WriteStdout(cs.c_str());
Now:
boost::iostreams::stream<pysys_stdout_sink> pysys_stdout;
pysys_stdout.open(pysys_stdout_sink());
pysys_stdout << "Hello, Python world!" << std::endl;
(I had to add the line:
pysys_stdout.open(pysys_stdout_sink());
to make it work.)
Thank you very much for your help,
Dietrich
--- Here the code to play around with on unix/linux - maybe it is helpful for some other person with the same problem: mkdir -p /tmp/pysys_stdout cd /tmp/pysys_stdout cat > pysys_stdout.cpp <<FIN /* pysys_stdout.cpp */ #include <python2.5/Python.h> #include <algorithm> // min #include <iosfwd> // streamsize #include <boost/iostreams/categories.hpp> // sink_tag #include <boost/iostreams/stream.hpp> // stream #include <boost/format.hpp> // format class pysys_stdout_sink { public: typedef char char_type; typedef boost::iostreams::sink_tag category; std::streamsize write( const char* s, std::streamsize n ) { // PySys_WriteStdout truncates to 1000 chars static const std::streamsize MAXSIZE = 1000; std::streamsize written = std::min( n, MAXSIZE ); PySys_WriteStdout( (boost::format("%%.%1%s") % written).str().c_str(), s ); return written; } }; boost::iostreams::stream<pysys_stdout_sink> pysys_stdout; int main() { Py_Initialize(); pysys_stdout.open(pysys_stdout_sink()); pysys_stdout << "Hello, Python world!\n"; } /* fin */ FIN touch project-root.jam cat > Jamfile <<FIN # Jamfile # Python library lib python2.5 ; # Build pysys_stdout example exe pysys_stdout : pysys_stdout.cpp python2.5 ; # fin. FIN ls -l > total 8 > -rw-r--r-- 1 dietrich dietrich 131 2009-05-14 22:56 Jamfile > -rw-r--r-- 1 dietrich dietrich 0 2009-05-14 22:56 project-root.jam > -rw-r--r-- 1 dietrich dietrich 982 2009-05-14 22:56 pysys_stdout.cpp bjam > [...] bin/gcc-4.3.3/debug/pysys_stdout > Hello, Python world! On Wed, 2009-05-13 at 01:11 -0700, Christopher Currie wrote: > On Mon, May 11, 2009 at 2:17 PM, Early Ehlinger <earlye_at_[hidden]> wrote: > > Basically, you need to create a streambuf class that calls > > PySys_WriteStdout() inside your_streambuf_class::sync(). > >> http://lists.boost.org/mailman/listinfo.cgi/boost-users > > It's probably fairly straightforward to do this using Boost.Iostreams, > by creating a model of Sink: > > include <Python.h> > > #include <algorithm> // min > #include <iosfwd> // streamsize > #include <boost/iostreams/categories.hpp> // sink_tag > #include <boost/iostreams/stream.hpp> // stream > #include <boost/format.hpp> // format > > class pysys_stdout_sink { > public: > typedef char char_type; > typedef boost::iostreams::sink_tag category; > > std::streamsize write( const char* s, std::streamsize n ) { > // PySys_WriteStdout truncates to 1000 chars > static const std::streamsize MAXSIZE = 1000; > > std::streamsize written = std::min( n, MAXSIZE ); > PySys_WriteStdout( (boost::format("%%.%1%s") % > written).str().c_str(), s ); > > return written; > } > }; > > boost::iostreams::stream<pysys_stdout_sink> pysys_stdout; > > int main() > { > Py_Initialize(); > pysys_stdout << "Hello, Python world!\n"; > } > > HTH, > Christopher > _______________________________________________ > Boost-users mailing list > Boost-users_at_[hidden] > http://lists.boost.org/mailman/listinfo.cgi/boost-users
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net