1 #include "py/python.hpp"
5 namespace py = boost::python;
7 MussaPython::MussaPython()
10 // add our mussa module to our environment
11 PyImport_AppendInittab("mussa", &initmussa);
12 // go ahead and finish initalizing python
14 // get reference to the global namespace
15 py::object main_module(
16 (py::handle<>(py::borrowed(PyImport_AddModule("__main__"))))
18 main_namespace = main_module.attr("__dict__");
19 // FIXME: this really should be a configuration file?
20 run("import __main__\n"
22 "import webbrowser\n");
23 } catch (py::error_already_set e) {
28 void MussaPython::run(std::string code)
31 PyObject *global_ptr = main_namespace.ptr();
32 py::object result( py::handle<>(
33 (PyRun_String(code.c_str(), Py_file_input, global_ptr, global_ptr)
35 } catch( py::error_already_set ) {
40 py::object MussaPython::eval(std::string code)
43 PyObject *global_ptr = main_namespace.ptr();
44 py::object result( py::handle<>(
45 (PyRun_String(code.c_str(), Py_eval_input, global_ptr, global_ptr)
48 } catch( py::error_already_set ) {
56 void MussaPython::interpreter(FILE *fp)
59 PyRun_InteractiveLoop(fp, "mussa");
60 } catch (py::error_already_set e) {
65 py::object MussaPython::operator[](std::string name)
67 std::string code = "reduce(lambda m,n: m.__dict__[n], [__main__] + '";
69 code += "'.split('.'))";
72 py::object py_name(name);
73 py::object name_list = py_name.attr("split")(".");
74 int name_list_len = extract<int>(name_list.attr("__len__")());
75 py::object lookup = main_namespace["__main__"];
76 for(int i=0; i < name_list_len; ++i) {
77 lookup = lookup.attr("__dict__")(name_list[i]);
78 //std::cout << lookup << std::endl;
84 //! return a reference to a single mussa python interpreter
87 static MussaPython py;