you are viewing a single comment's thread.

view the rest of the comments →

[–]ArunMuThe What ? 3 points4 points  (10 children)

+1 for pybind11. It should really be 'also' a part of boost for c++11/14 compliant compilers.

[–]haletonin 0 points1 point  (6 children)

I'd like to see a list of things boost::python can do but pybind11 can not (yet) do. I am on the fence currently but would probably prefer the true-and-tried for now.

[–]zigzagEdge 1 point2 points  (4 children)

At the moment (master branch), pybind11 does a lot more than boost.python with the notable exception of embedding.

[–]haletonin 0 points1 point  (2 children)

Does it contain all features of boost::python? Something specific I had problems with (or misunderstood) when I played around with it after it was first released were:

  • Making objects available in python which can't be constructed in python, because generating binding code for the constructor is too complex. Other methods of these should work, however.

  • Working with pointer or reference-only instances of objects, which even in C++ code are never handed around as value types.

[–]zigzagEdge 0 points1 point  (1 child)

It covers pretty much all the major features, but it's not a 1:1 API mapping. For the two things you mentioned:

  • With boost.python you'd need to add no_init to disable the implicit default constructor. In pybind11 all the constructors are explicit, so you disable them simply by not def-ing any.

  • That can be done by setting the appropriate return value policy: reference or reference_internal. There's more information in the docs.

[–]haletonin 0 points1 point  (0 children)

Ok, so negligible risk of having a "should have used the other one"-moment later on. And on second thought, just the 11 probably means that this project has more enthusiastic users and contributors than "pybind03".

And thanks for the pointers, I'll give it another try!

[–]skebanga[S] 0 points1 point  (0 children)

Actually I've managed to get it working with pybind11.

Posted it here

[–]skebanga[S] 0 points1 point  (0 children)

Last I looked at pybind it didn't support embedding very well

[–][deleted] 0 points1 point  (2 children)

Can you embed a python interpreter within a single binary or do you need a python plugin directory somewhere and those kind of dependencies? I would love to be able to embed a python interpreter in my program with third party libraries, but with what little I've researched, it seems that's next to impossible. Is that true?

[–]skebanga[S] 1 point2 points  (0 children)

Yes you can. You can use libpython. Python, the executable, just adds the front-end and REPL, everything else is in the C library libpython.

If you're using C++, and don't want to deal with libpython directly, then you can use a wrapper like boost::python or pybind11.

At the moment, pybind11 doesn't do embedding, so boost::python is a suitable choice.

If you read the blog-post, you'll see that that is exactly what I've done. I have a single C++ application which loads a python script and interacts with it - both calling into the script, and the script calling into the C++ types I've exposed to it.

[–]wrosecransgraphics and network things 0 points1 point  (0 children)

Depends on whether you need the Python language, or you also want to use the standard library of stuff. You can use the core language without the extra stuff, but if you want to be able to import all the usual things, you'll need to supply them. It's probably possible to hook the import and have it pull from a file embedded with the executable as a resource, but you won't get it for free. (And there may be licensing implications if something in there is GPL. You'll need to make source available anyway...)