]> git.xonotic.org Git - xonotic/netradiant.git/blob - radiant/pybindconnector.cpp
Initial python support
[xonotic/netradiant.git] / radiant / pybindconnector.cpp
1 /*
2    Copyright (C) 2018, Sebastian Schmidt
3    All Rights Reserved.
4
5    This file is part of NetRadiant.
6
7    NetRadiant is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    NetRadiant is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with NetRadiant; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20  */
21 #include <cstdlib>
22 #include <string>
23
24 #include "pybindconnector.h"
25 #include "../libs/pybind11/include/pybind11/embed.h"
26 #include <../libs/pybind11/include/pybind11/eval.h>
27
28
29 namespace py = pybind11;
30
31 static py::dict scope;
32
33
34
35 // // TODO: embedded modules
36 // PYBIND11_EMBEDDED_MODULE(radiant, m) {
37 //     m.def("TODO", [](){});
38 // }
39
40
41 void PYBIND_initializeInterpreter() {
42     py::initialize_interpreter();
43     scope = py::module::import("__main__").attr("__dict__");
44 }
45
46 std::string PYBIND_callfunction(std::string modulename,std::string functionname) {
47     py::object module = py::module::import(modulename.c_str());
48     py::object f = module.attr(functionname.c_str());
49     py::str result = f();
50     return result.cast<std::string>();
51 }
52
53 void PYBIND_exec(std::string code)
54 {
55     py::exec(code.c_str(), scope);
56 }
57
58 std::string PYBIND_scope_as_string()
59 {
60     return py::str(scope).cast<std::string>();
61 }
62
63 void PYBIND_finalizeInterpreter() {
64     scope.release();
65     py::finalize_interpreter();
66 }
67