Mercurial > pytave
changeset 161:dfea7eee7749
add pyexec and pyeval commands
* pyeval.cc: new oct file.
* pyexec.cc: new oct file.
* Makefile.am (OCT_FILES): Include pyeval.oct and pyexec.oct in the list.
author | Colin Macdonald <cbm@m.fsf.org> |
---|---|
date | Thu, 10 Mar 2016 23:43:15 -0800 |
parents | eab5c6026303 |
children | df7b4a5ab542 |
files | Makefile.am pyeval.cc pyexec.cc |
diffstat | 3 files changed, 208 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/Makefile.am Wed Mar 09 14:15:26 2016 -0800 +++ b/Makefile.am Thu Mar 10 23:43:15 2016 -0800 @@ -34,7 +34,9 @@ README.md OCT_FILES = \ - py.oct + py.oct \ + pyeval.oct \ + pyexec.oct PYTAVE_HEADER_FILES = \ arrayobjectdefs.h \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pyeval.cc Thu Mar 10 23:43:15 2016 -0800 @@ -0,0 +1,103 @@ +/* + +Copyright (C) 2016 Colin B. Macdonald + +This file is part of Pytave. + +Pytave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +Pytave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with Pytave; see the file COPYING. If not, see +<http://www.gnu.org/licenses/>. + +*/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <dlfcn.h> +#include <boost/python.hpp> +#include <boost/python/numeric.hpp> + +/* Both boost::python and octave define HAVE_STAT and HAVE_FSTAT. Ideally, + they shouldn't expose their configuration in the header files, but they do. + This silences the compiler warning. */ +#undef HAVE_STAT +#undef HAVE_FSTAT + +#include <oct.h> + +#define PYTAVE_DO_DECLARE_SYMBOL +#include "pytavedefs.h" +#include "arrayobjectdefs.h" +#include "exceptions.h" +#include "python_to_octave.h" + +using namespace boost::python; + +DEFUN_DLD (pyeval, args, nargout, + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} pyeval (@var{expr})\n\ +Evaluate a python expression and return result.\n\ +\n\ +@end deftypefn") +{ + octave_value_list retval; + + int nargin = args.length (); + + std::string code = args(0).string_value (); + + dlopen("libpython2.7.so", RTLD_GLOBAL|RTLD_LAZY); + + + Py_Initialize (); + std::cerr << "python initialized" << std::endl; + + try + { + object main_module = import ("__main__"); + object main_namespace = main_module.attr ("__dict__"); + object res = eval (code.c_str (), main_namespace, main_namespace); + // currently, we cannot return the raw object to octave... + if (! res.is_none ()) + { + octave_value val; + pytave::pyobj_to_octvalue (val, res); + retval(0) = val; + } + } + catch (pytave::object_convert_exception const &) + { + error ("pyeval: error in return value type conversion"); + } + catch (error_already_set const &) + { + std::cerr << "in here" << std::endl; + PyObject *ptype, *pvalue, *ptraceback; + PyErr_Fetch (&ptype, &pvalue, &ptraceback); + + try + { + std::string message = extract<std::string> (pvalue); + error ("pyeval: %s", message.c_str ()); + } + catch (error_already_set const &) + { + PyErr_Restore (ptype, pvalue, ptraceback); + PyErr_Print (); + } + std::cerr << "leaving" << std::endl; + } + + return retval; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pyexec.cc Thu Mar 10 23:43:15 2016 -0800 @@ -0,0 +1,102 @@ +/* + +Copyright (C) 2016 Colin B. Macdonald + +This file is part of Pytave. + +Pytave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +Pytave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with Pytave; see the file COPYING. If not, see +<http://www.gnu.org/licenses/>. + +*/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <dlfcn.h> +#include <boost/python.hpp> +#include <boost/python/numeric.hpp> + +/* Both boost::python and octave define HAVE_STAT and HAVE_FSTAT. Ideally, + they shouldn't expose their configuration in the header files, but they do. + This silences the compiler warning. */ +#undef HAVE_STAT +#undef HAVE_FSTAT + +#include <oct.h> + +#define PYTAVE_DO_DECLARE_SYMBOL +#include "pytavedefs.h" +#include "arrayobjectdefs.h" +#include "exceptions.h" +#include "python_to_octave.h" + +using namespace boost::python; + +DEFUN_DLD (pyexec, args, nargout, + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} pyexec (@var{func})\n\ +Execute some python code.\n\ +\n\ +@end deftypefn") +{ + octave_value_list retval; + + int nargin = args.length (); + + if (nargin != 1) + { + print_usage (); + return retval; + } + + std::string code = args(0).string_value (); + + dlopen("libpython2.7.so", RTLD_GLOBAL|RTLD_LAZY); + + Py_Initialize (); + + try + { + object main_module = import ("__main__"); + object main_namespace = main_module.attr ("__dict__"); + // TODO: figure out exec return code: + // http://www.boost.org/doc/libs/1_38_0/libs/python/doc/v2/exec.html + exec (code.c_str (), main_namespace, main_namespace); + //std::cerr << "exec done" << std::endl; + + } + // just copy-pasted from py.cc + catch (pytave::object_convert_exception const &) + { + error ("pyexec: error in return value type conversion"); + } + catch (error_already_set const &) + { + PyObject *ptype, *pvalue, *ptraceback; + PyErr_Fetch (&ptype, &pvalue, &ptraceback); + + try + { + std::string message = extract<std::string> (pvalue); + error ("pyexec: %s", message.c_str ()); + } + catch (error_already_set const &) + { + PyErr_Restore (ptype, pvalue, ptraceback); + PyErr_Print (); + } + } + return retval; +}