Boost logo

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