Continued from the previous post.
These are equivalent version of the examples on the previous post using boost::python.
[main2boost.cpp]
#include <boost/python/detail/wrap_python.hpp> #include <boost/python/object.hpp> using namespace boost::python; int main() { Py_Initialize(); object o_main = object(handle<>(borrowed(PyImport_AddModule("__main__")))); object o_int10000(10000); o_main.attr("tamtam") = o_int10000; PyRun_SimpleString("print tamtam"); Py_Finalize(); return 0; }
[main4boost.cpp]
#include <boost/python/detail/wrap_python.hpp> #include <boost/python/object.hpp> #include <boost/python/dict.hpp> using namespace boost::python; int main() { Py_Initialize(); object o_main = object(handle<>(borrowed(PyImport_AddModule("__main__")))); dict o_dict; o_dict["foo"] = "bar"; o_main.attr("tamtam") = o_dict; PyRun_SimpleString("print tamtam"); Py_Finalize(); return 0; }
[main5boost.cpp]
#include <boost/python/detail/wrap_python.hpp> #include <boost/python/object.hpp> #include <boost/python/dict.hpp> #include <boost/python/extract.hpp> #include <iostream> #include <string> using namespace boost::python; int main() { Py_Initialize(); PyRun_SimpleString("tamtam = {'foo':'bar'}"); object o_main = object(handle<>(borrowed(PyImport_AddModule("__main__")))); dict o_dict(o_main.attr("tamtam")); object o_value = o_dict["foo"]; //Oops I couldn't find a boost::python way of type checking. if(PyObject_IsInstance(o_value.ptr(), (PyObject*)&PyString_Type)) { std::string valstr = extract < std::string > (o_value); std::cout << valstr << std::endl; } Py_Finalize(); return 0; }
[main6boost.cpp]
#include <boost/python/detail/wrap_python.hpp> #include <boost/python/object.hpp> #include <boost/python/extract.hpp> #include <iostream> #include <string> using namespace boost::python; int main() { Py_Initialize(); PyRun_SimpleString( "def myfunc(a, b, c):¥n" " print a¥n" " return b + c¥n" ); object o_main = object(handle<>(borrowed(PyImport_AddModule("__main__")))); object o_func = o_main.attr("myfunc"); object o_int(10000); object o_foo("foo"); object o_bar("bar"); object o_result = o_func(o_int, o_foo, o_bar); //object o_result = o_func(10000, "foo", "bar"); also works. std::string resultstr = extract < std::string > (o_result); std::cout << resultstr << std::endl; Py_Finalize(); return 0; }
- o_ prefix is my naming convension
- To use Python C/API function directly, you need to include boost/python/detail/wrap_python.hpp instead of including Python.h. Include it before any other, just like Python.h
- borrowed() is used when you are passing a Python object that you are not responsible to dereference. That's all you need to be careful around reference counter, boost::python does everthing else.
- You'll find a better tut here.
http://www.boost.org/doc/libs/1_35_0/libs/python/doc/tutorial/doc/html/index.html
Document about "Exception handling" in the "Embedding" chapter is a must to read.
- Though I didn't used here, there's a function exec() that can replace PyRun_*().
No comments:
Post a Comment