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 PyImport_AppendInittab("mussaqui", &initmussaqui);
18 // go ahead and finish initalizing python
20 // get reference to the global namespace
21 py::object main_module(
22 (py::handle<>(py::borrowed(PyImport_AddModule("__main__"))))
24 main_namespace = main_module.attr("__dict__");
25 // FIXME: this really should be a configuration file?
26 run("import __main__\n"
29 } catch (py::error_already_set e) {
34 void MussaPython::run(std::string code)
37 PyObject *global_ptr = main_namespace.ptr();
38 py::object result( py::handle<>(
39 (PyRun_String(code.c_str(), Py_file_input, global_ptr, global_ptr)
41 } catch( py::error_already_set ) {
46 py::object MussaPython::eval(std::string code)
49 PyObject *global_ptr = main_namespace.ptr();
50 py::object result( py::handle<>(
51 (PyRun_String(code.c_str(), Py_eval_input, global_ptr, global_ptr)
54 } catch( py::error_already_set ) {
62 void MussaPython::interpreter()
66 "sys.argv = ['Mussa']\n"
67 "banner='Welcome to Mussa'\n"
69 " from IPython.Shell import IPShellEmbed\n"
70 " ipshell = IPShellEmbed(banner=banner)\n"
72 "except ImportError, e:\n"
74 " code.interact(banner, local=globals())\n"
75 "print 'exiting interpreter'\n"
77 } catch (py::error_already_set e) {
81 void MussaPython::simple_interpreter(FILE *fp)
84 PyRun_InteractiveLoop(fp, "mussa");
85 } catch (py::error_already_set e) {
90 py::object MussaPython::operator[](std::string name)
92 typedef std::vector< std::string > string_vector;
93 string_vector split_name;
94 alg::split(split_name, name, alg::is_any_of("."));
96 py::object lookup = main_namespace["__main__"];
98 for (string_vector::const_iterator name_i = split_name.begin();
99 name_i != split_name.end();
102 lookup = lookup.attr("__dict__")[*name_i];
107 //! return a reference to a single mussa python interpreter
108 MussaPython& get_py()
110 static MussaPython *py;
112 py = new MussaPython;