call metodu
Python metodunu callback olarak çağırmak istersek şöyle
yaparız.
#this is the variable that will hold a reference to the python function
PyObject *py_callback;
#invoke the python function
bp::call<void>(py_callback);
exec metodu
exec metodu yazısına taşıdım.
exec_file metodu
Örnek
Şöyle
yaparız.
std::string a_file = "py-test-dog.py";
python::object main_module = python::import("__main__");
python::object global(main_module.attr("__dict__"));
try
{
python::object ignored = python::exec_file(
a_file.c_str() , global, global );
std::cout << "Executed script" << std::endl;
}
catch(std::exception& e)
{
std::cout << e.what() << std::endl;
}
Örnek 2
Elimizde python
olsun.
class MyPythonClass:
def Func1(self, param):
return
def Func2(self, strParam):
return strParam
Bu sınıfı yükleyip Func2 metodunu çalıştırmak için şöyle
yaparız.
namespace python = boost::python;
python::object main = python::import("main");
python::object mainNamespace = main.attr("__dict__");
//add the contents of the script to the global namespace
python::object script = python::exec_file(path_to_my_script, mainNamespace);
//add an instance of the object to the global namespace
python::exec("foo = MyPythonClass()", mainNamespace);
//create boost::python::object that refers to the created object
python::object foo = main.attr("foo");
//call Func2 on the python::object via attr
//then extract the result into a const char* and assign it to a std::string
//the last bit could be done on multiple lines with more intermediate variables
// if desired
const std::string func2return = python::extract<const char*>(foo.attr("Func2")
("hola"));
assert(func2return == "hola");
handle_exception metodu
Şöyle
yaparız.
if (bp::handle_exception(...) )
{
if (PyErr_Occurred())
{
std::cout << "Python Error detected"
<< std::endl;
PyErr_Print();
}
else
{
std::cout << "A C++ exception was thrown for which "
<< "there was no exception translator registered."
<< std::endl;
}
}
import metodu
Bu metodu çağırmadan önce Python yüklenmiş olmalıdır. Şöyle
yaparız.
// Add the current working directory to the python path variable
// so that chart.py can be imported.
setenv("PYTHONPATH", ".", 1);
Py_Initialize();
Örnek 1
İsmi belirtilen python betiğini C++ koduna dahil eder. Elimizde test_module.py isimli dosya olsun. Şöyle
yaparız.
bp::object a = bp::import ("test_module");
how to load a python module için kolaylık sağlayan bir metod var. Kolay import için şöyle
yaparız.
namespace bp = boost::python;
bp::object import(const std::string& module, const std::string& path,
bp::object& globals)
{
bp::dict locals;
locals["module_name"] = module;
locals["path"] = path;
bp::exec("import imp\n"
"new_module = imp.load_module(module_name, open(path), path,
('py', 'U', imp.PY_SOURCE))\n",
globals,
locals);
return locals["new_module"];
}
Örnek 2
Şöyle
yaparız.
bp::object main = bp::import("__main__");
bp::object globals = main.attr("__dict__");
bp::object module = import("test", "test.py", globals);
bp::object run = module.attr("run");
Örnek 3
python modülü yüklendikten sonra C++ metodu gibi kullanamayız. Şu kod
derlenmez.
// Import the chart module
bp::object mod = py::import("chart");
// Create the chart object
bp::object myChart = mod.attr("Chart")();
// Show the chart
myChart.show();
Hata olarak şunu
alırız.
error: ‘class boost::python::api::object’ has no member named ‘show’
myChart.show();
Şöyle yapmak
gerekir.
bp::object run = module.attr("show");
make_function metodu
Şöyle
yaparız. callback python'a verilebilir. Böylece python çalışırken bizi tetikler.
void callback_handler(bp::object ch
, bp::object method
, bp::object properties
, std::string const& body)
{
std::cout << "in handler: " << body << std::endl;
}
bp::object h = bp::make_function(callback_handler);
make_tuple metodu
Elimizde şöyle bir nesne
olsun.
PyObject * ret;
Şöyle
yaparız.
boost::python::tuple t =
boost::python::make_tuple(true, boost::python::handle<>(ret));