<p>I'm currently working on a project were I had to wrap the C++ classes with Python to be able to script the program. So my specific experience also involved embedding the Python interpreter in our program.</p>

<p>The alternatives I tried were:</p>

<ul>
<li><p>Boost.Python</p>

<p>I liked the cleaner API produced by Boost.Python, but the fact that it would have required that users install an additional dependency made us switch to SWIG.</p></li>
<li><p>SWIG</p>

<p>SWIG's main advantage for us was that it doesn't require end users to install it to use the final program.</p></li>
</ul>

<p>What have you used to do this, and what has been your experience with it?</p>

I've used both (for the same project): Boost is better integrated with the STL, and especially C++ exceptions.  Also, its memory management mechanism (which tries to bridge C++ memory management and Python GC) is way more flexible than SWIG's.  However, SWIG has
much
better documentation, no external dependencies, and if you get the library wrapped in SWIG for Python you're more than half-way there to getting a Java/Perl/Ruby wrapper as well.
I don't think there's a clear-cut choice: for smaller projects, I'd go with Boost.Python again, for larger long-lived projects, the extra investment in SWIG is worth it.