From: Justin W. <Jus...@mo...> - 2002-01-10 17:41:24
|
Hi, I am using jython embedded in java, specifically the PythonInterpreter class. I have a java object containing a series of member variables. I want to pass it into the interpreter and generate an array based on those member variables and a user-defined jython script. I then want to take the resulting array and drop out of the interpreter / back into java. I can pass the object into the interpreter and generate the result array no problem. The difficulty seems to be getting out of the interpreter. In the docs, the only way out I can see is via a PyObject object (from PythonInterpreter.get(String _name)) - I can have my result array either as a list or as a jarray, export it using this method and then re-cast to a PyArray. But how then do I convert to a java object or array ? I thought the following looked promising, PythonInterpreter interp=new PythonInterpreter(); interp.exec("import jarray"); interp.exec("x=jarray.array([1,2,3],'i')"); PyArray x=(PyArray)interp.get("x"); Class c=PyArray.char2class('i'); Object o=x.__tojava__(c); System.out.println(o.toString()); but it generates the result 'Error' which doesn't look promising (why is no exception thrown?) Thanks! |
From: brian z. <bz...@zi...> - 2002-01-10 22:28:33
|
Justin, > PythonInterpreter interp=new PythonInterpreter(); > interp.exec("import jarray"); > interp.exec("x=jarray.array([1,2,3],'i')"); > PyArray x=(PyArray)interp.get("x"); > Class c=PyArray.char2class('i'); > Object o=x.__tojava__(c); > System.out.println(o.toString()); > The problem is you are asking PyArray to return an object of the type 'int' but PyArray's __tojava__ doesn't know anything about this type. Instead you have two options: (1) Ask for a generic Object. (2) Ask for the specific array type. If you choose to use (2), the following will create the correctly typed array: Class c = Array.newInstance(PyArray.char2class('i'), 0).getClass(); <note> I am not sure of another way to get an 'int[]' Class instance. Does anyone else? I'm surely missing something though this works. </note> > but it generates the result 'Error' which doesn't look > promising (why is no exception thrown?) You are really getting back the Py.NoConversion instance. You would see an exception if you tried to cast to some other type but since you don't you do not see an exception. In order to iterate the array dynamically I think you'll need to use the java.lang.reflect.Array class again to get the values, such as: for(int i=0; i<Array.getLength(o); i++) { System.out.println(Array.getInt(o, i)); } if you choose not statically cast the Object returned from PyArray.__tojava__(). If you choose to do it dynamically you might need some sort of switch in order to figure out what Array.getX() method to use or just use Array.get() to get an Object back. Hope this helps, brian |
From: Jeff E. <je...@ad...> - 2002-01-11 15:55:47
|
brian zimmer wrote: > If you choose to use (2), the following will create the correctly typed > array: > > Class c = Array.newInstance(PyArray.char2class('i'), 0).getClass(); > > <note> > I am not sure of another way to get an 'int[]' Class instance. Does > anyone else? I'm surely missing something though this works. > </note> java.lang.Class.forName("[I") |