Mercurial > pytave
annotate pyeval.cc @ 202:3fa99babc7b5
pyeval: preliminary support for returning pyobj
Introduces static method `pyobj.fromPythonVarName(s)`, whereas the
constructor itself now no longer deals with `__InOct__` itself.
* pyeval.cc: return the id() instead for now
* @pyobj/pyobj.m: change constructor, add method
* @pyobj/dummy.m: add doctests
author | Colin Macdonald <cbm@m.fsf.org> |
---|---|
date | Fri, 20 May 2016 00:20:03 -0700 |
parents | 28dc607532c2 |
children | 61df785bd8b0 |
rev | line source |
---|---|
161 | 1 /* |
2 | |
3 Copyright (C) 2016 Colin B. Macdonald | |
4 | |
5 This file is part of Pytave. | |
6 | |
7 Pytave is free software; you can redistribute it and/or modify it | |
8 under the terms of the GNU General Public License as published by the | |
9 Free Software Foundation; either version 3 of the License, or (at your | |
10 option) any later version. | |
11 | |
12 Pytave is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with Pytave; see the file COPYING. If not, see | |
19 <http://www.gnu.org/licenses/>. | |
20 | |
21 */ | |
22 | |
162
df7b4a5ab542
Apply recent project changes to pyeval/pyexec, clean up
Mike Miller <mtmiller@octave.org>
parents:
161
diff
changeset
|
23 #if defined (HAVE_CONFIG_H) |
df7b4a5ab542
Apply recent project changes to pyeval/pyexec, clean up
Mike Miller <mtmiller@octave.org>
parents:
161
diff
changeset
|
24 # include <config.h> |
161 | 25 #endif |
26 | |
27 #include <dlfcn.h> | |
28 #include <boost/python.hpp> | |
29 #include <boost/python/numeric.hpp> | |
30 | |
31 #include <oct.h> | |
32 | |
33 #define PYTAVE_DO_DECLARE_SYMBOL | |
34 #include "arrayobjectdefs.h" | |
35 #include "exceptions.h" | |
36 #include "python_to_octave.h" | |
37 | |
38 using namespace boost::python; | |
39 | |
40 DEFUN_DLD (pyeval, args, nargout, | |
41 "-*- texinfo -*-\n\ | |
173
28dc607532c2
doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents:
162
diff
changeset
|
42 @deftypefn {} {} pyeval (@var{expr})\n\ |
28dc607532c2
doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents:
162
diff
changeset
|
43 @deftypefnx {} {@var{x} =} pyeval (@var{expr})\n\ |
28dc607532c2
doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents:
162
diff
changeset
|
44 Evaluate a Python expression and return the result.\n\ |
28dc607532c2
doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents:
162
diff
changeset
|
45 \n\ |
28dc607532c2
doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents:
162
diff
changeset
|
46 Examples:\n\ |
28dc607532c2
doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents:
162
diff
changeset
|
47 @example\n\ |
28dc607532c2
doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents:
162
diff
changeset
|
48 @group\n\ |
28dc607532c2
doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents:
162
diff
changeset
|
49 pyeval (\"sys.version\")\n\ |
28dc607532c2
doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents:
162
diff
changeset
|
50 @result{} ...\n\ |
28dc607532c2
doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents:
162
diff
changeset
|
51 pyeval (\"dict(one=1, two=2)\")\n\ |
28dc607532c2
doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents:
162
diff
changeset
|
52 @result{} scalar structure containing the fields:\n\ |
28dc607532c2
doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents:
162
diff
changeset
|
53 two = 2\n\ |
28dc607532c2
doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents:
162
diff
changeset
|
54 one = 1\n\ |
28dc607532c2
doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents:
162
diff
changeset
|
55 @end group\n\ |
28dc607532c2
doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents:
162
diff
changeset
|
56 @end example\n\ |
28dc607532c2
doc: Clarify and clean up docstrings for all oct files
Mike Miller <mtmiller@octave.org>
parents:
162
diff
changeset
|
57 @seealso{pycall, pyexec}\n\ |
161 | 58 @end deftypefn") |
59 { | |
60 octave_value_list retval; | |
61 | |
62 int nargin = args.length (); | |
63 | |
64 std::string code = args(0).string_value (); | |
65 | |
202
3fa99babc7b5
pyeval: preliminary support for returning pyobj
Colin Macdonald <cbm@m.fsf.org>
parents:
173
diff
changeset
|
66 std::string id; |
3fa99babc7b5
pyeval: preliminary support for returning pyobj
Colin Macdonald <cbm@m.fsf.org>
parents:
173
diff
changeset
|
67 object res; |
3fa99babc7b5
pyeval: preliminary support for returning pyobj
Colin Macdonald <cbm@m.fsf.org>
parents:
173
diff
changeset
|
68 |
161 | 69 Py_Initialize (); |
70 | |
202
3fa99babc7b5
pyeval: preliminary support for returning pyobj
Colin Macdonald <cbm@m.fsf.org>
parents:
173
diff
changeset
|
71 object main_module = import ("__main__"); |
3fa99babc7b5
pyeval: preliminary support for returning pyobj
Colin Macdonald <cbm@m.fsf.org>
parents:
173
diff
changeset
|
72 object main_namespace = main_module.attr ("__dict__"); |
3fa99babc7b5
pyeval: preliminary support for returning pyobj
Colin Macdonald <cbm@m.fsf.org>
parents:
173
diff
changeset
|
73 |
161 | 74 try |
75 { | |
202
3fa99babc7b5
pyeval: preliminary support for returning pyobj
Colin Macdonald <cbm@m.fsf.org>
parents:
173
diff
changeset
|
76 res = eval (code.c_str (), main_namespace, main_namespace); |
3fa99babc7b5
pyeval: preliminary support for returning pyobj
Colin Macdonald <cbm@m.fsf.org>
parents:
173
diff
changeset
|
77 object builtins = main_module.attr ("__builtins__"); |
3fa99babc7b5
pyeval: preliminary support for returning pyobj
Colin Macdonald <cbm@m.fsf.org>
parents:
173
diff
changeset
|
78 // hex(id(res)) |
3fa99babc7b5
pyeval: preliminary support for returning pyobj
Colin Macdonald <cbm@m.fsf.org>
parents:
173
diff
changeset
|
79 object idtmp = builtins.attr("hex")(builtins.attr("id")(res)); |
3fa99babc7b5
pyeval: preliminary support for returning pyobj
Colin Macdonald <cbm@m.fsf.org>
parents:
173
diff
changeset
|
80 id = extract<std::string> (idtmp); |
3fa99babc7b5
pyeval: preliminary support for returning pyobj
Colin Macdonald <cbm@m.fsf.org>
parents:
173
diff
changeset
|
81 //std::cerr << "got it: " << id << std::endl; |
162
df7b4a5ab542
Apply recent project changes to pyeval/pyexec, clean up
Mike Miller <mtmiller@octave.org>
parents:
161
diff
changeset
|
82 |
df7b4a5ab542
Apply recent project changes to pyeval/pyexec, clean up
Mike Miller <mtmiller@octave.org>
parents:
161
diff
changeset
|
83 // FIXME: currently, we cannot return the raw object to octave... |
161 | 84 if (! res.is_none ()) |
85 { | |
86 octave_value val; | |
87 pytave::pyobj_to_octvalue (val, res); | |
88 retval(0) = val; | |
89 } | |
90 } | |
91 catch (pytave::object_convert_exception const &) | |
92 { | |
202
3fa99babc7b5
pyeval: preliminary support for returning pyobj
Colin Macdonald <cbm@m.fsf.org>
parents:
173
diff
changeset
|
93 printf ("pyeval: could not convert return value to Octave-native object, making pyobj...\n"); |
3fa99babc7b5
pyeval: preliminary support for returning pyobj
Colin Macdonald <cbm@m.fsf.org>
parents:
173
diff
changeset
|
94 // Ensure we have a __InOct__ dict, and then put `res` into it |
3fa99babc7b5
pyeval: preliminary support for returning pyobj
Colin Macdonald <cbm@m.fsf.org>
parents:
173
diff
changeset
|
95 exec ("if not (\"__InOct__\" in vars() or \"__InOct__\" in globals()):\n" |
3fa99babc7b5
pyeval: preliminary support for returning pyobj
Colin Macdonald <cbm@m.fsf.org>
parents:
173
diff
changeset
|
96 " __InOct__ = dict()\n", |
3fa99babc7b5
pyeval: preliminary support for returning pyobj
Colin Macdonald <cbm@m.fsf.org>
parents:
173
diff
changeset
|
97 main_namespace, main_namespace); |
3fa99babc7b5
pyeval: preliminary support for returning pyobj
Colin Macdonald <cbm@m.fsf.org>
parents:
173
diff
changeset
|
98 main_namespace["__InOct__"][id] = res; |
3fa99babc7b5
pyeval: preliminary support for returning pyobj
Colin Macdonald <cbm@m.fsf.org>
parents:
173
diff
changeset
|
99 //retval(0) = pyobj(id); |
3fa99babc7b5
pyeval: preliminary support for returning pyobj
Colin Macdonald <cbm@m.fsf.org>
parents:
173
diff
changeset
|
100 // FIXME: how to do the above? For now, just return the string |
3fa99babc7b5
pyeval: preliminary support for returning pyobj
Colin Macdonald <cbm@m.fsf.org>
parents:
173
diff
changeset
|
101 retval(0) = id; |
161 | 102 } |
103 catch (error_already_set const &) | |
104 { | |
105 PyObject *ptype, *pvalue, *ptraceback; | |
106 PyErr_Fetch (&ptype, &pvalue, &ptraceback); | |
107 | |
108 try | |
109 { | |
110 std::string message = extract<std::string> (pvalue); | |
111 error ("pyeval: %s", message.c_str ()); | |
112 } | |
113 catch (error_already_set const &) | |
114 { | |
115 PyErr_Restore (ptype, pvalue, ptraceback); | |
116 PyErr_Print (); | |
117 } | |
118 } | |
119 | |
120 return retval; | |
121 } |