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;
13 MussaPython::MussaPython()
17 void MussaPython::add_module(const std::string &name, python_module_init initfunc)
19 python_modules.push_back( module_item(name, initfunc) );
22 void MussaPython::AppendInittab(const module_item &item)
24 PyImport_AppendInittab(const_cast<char *>(item.first.c_str()), item.second);
27 void MussaPython::init_interpreter()
30 // add any compiled in modules to our environment
31 for_each(python_modules.begin(), python_modules.end(), AppendInittab);
32 // go ahead and finish initalizing python
34 // get reference to the global namespace
35 py::object main_module(
36 (py::handle<>(py::borrowed(PyImport_AddModule("__main__"))))
38 // setting the main_namespace must come before any calls to run or eval
39 main_namespace = main_module.attr("__dict__");
40 run("import __main__\n");
41 // import modules that were added to us into the interpreter
42 for(module_list::const_iterator item = python_modules.begin();
43 item != python_modules.end();
46 std::string code("import " + item->first);
49 } catch (py::error_already_set e) {
54 py::object MussaPython::get_namespace()
56 if (main_namespace.ptr() == Py_None) {
59 return main_namespace;
62 void MussaPython::run(std::string code)
65 PyObject *global_ptr = get_namespace().ptr();
66 py::object result( py::handle<>(
67 (PyRun_String(code.c_str(), Py_file_input, global_ptr, global_ptr)
69 } catch( py::error_already_set ) {
74 py::object MussaPython::eval(std::string code)
77 PyObject *global_ptr = get_namespace().ptr();
78 py::object result( py::handle<>(
79 (PyRun_String(code.c_str(), Py_eval_input, global_ptr, global_ptr)
82 } catch( py::error_already_set ) {
90 void MussaPython::interpreter()
94 "sys.argv = ['Mussa']\n"
95 "banner='Welcome to Mussa'\n"
97 " from IPython.Shell import IPShellEmbed\n"
98 " ipshell = IPShellEmbed(banner=banner)\n"
100 "except ImportError, e:\n"
102 " code.interact(banner, local=globals())\n"
103 "print 'exiting interpreter'\n"
105 } catch (py::error_already_set e) {
109 void MussaPython::simple_interpreter(FILE *fp)
112 PyRun_InteractiveLoop(fp, "mussa");
113 } catch (py::error_already_set e) {
118 py::object MussaPython::operator[](std::string name)
120 typedef std::vector< std::string > string_vector;
121 string_vector split_name;
122 alg::split(split_name, name, alg::is_any_of("."));
124 py::object lookup = get_namespace()["__main__"];
126 for (string_vector::const_iterator name_i = split_name.begin();
127 name_i != split_name.end();
130 lookup = lookup.attr("__dict__")[*name_i];
135 //! return a reference to a single mussa python interpreter
136 MussaPython *get_py_ptr()
138 static MussaPython *py;
140 py = new MussaPython;
145 MussaPython &get_py()
147 return *get_py_ptr();