1 #include "py/python.hpp"
2 namespace py = boost::python;
8 #include <boost/algorithm/string/split.hpp>
9 #include <boost/algorithm/string/classification.hpp>
10 namespace alg = boost::algorithm;
12 MussaPython::MussaPython()
15 // add our mussa module to our environment
16 PyImport_AppendInittab("mussa", &initmussa);
17 // go ahead and finish initalizing python
19 // get reference to the global namespace
20 py::object main_module(
21 (py::handle<>(py::borrowed(PyImport_AddModule("__main__"))))
23 main_namespace = main_module.attr("__dict__");
24 // FIXME: this really should be a configuration file?
25 run("import __main__\n"
27 "import webbrowser\n");
28 } catch (py::error_already_set e) {
33 void MussaPython::run(std::string code)
36 PyObject *global_ptr = main_namespace.ptr();
37 py::object result( py::handle<>(
38 (PyRun_String(code.c_str(), Py_file_input, global_ptr, global_ptr)
40 } catch( py::error_already_set ) {
45 py::object MussaPython::eval(std::string code)
48 PyObject *global_ptr = main_namespace.ptr();
49 py::object result( py::handle<>(
50 (PyRun_String(code.c_str(), Py_eval_input, global_ptr, global_ptr)
53 } catch( py::error_already_set ) {
61 void MussaPython::interpreter(FILE *fp)
64 PyRun_InteractiveLoop(fp, "mussa");
65 } catch (py::error_already_set e) {
70 py::object MussaPython::operator[](std::string name)
72 typedef std::vector< std::string > string_vector;
73 string_vector split_name;
74 alg::split(split_name, name, alg::is_any_of("."));
76 py::object lookup = main_namespace["__main__"];
78 for (string_vector::const_iterator name_i = split_name.begin();
79 name_i != split_name.end();
82 lookup = lookup.attr("__dict__")[*name_i];
87 //! return a reference to a single mussa python interpreter
90 static MussaPython py;