From: Javier C. <ja...@sr...> - 2003-11-11 14:22:35
|
Hello all, First of all, i would like to say that jython is extremely good and thank you very much for providing this incredible tool. My problem came when i tried to use a java class (made from a python class and compiled with jythonc) in jython environment (using jython 2.1). When i called a method of the class, i got a 'not implemented abstract method foo' error, being foo the name of the method. The method was in the java class, but it was failing when looking in the functions table generated in _PyInner class. I thought that i could not do this (i mean, i could not use a jythonc-compiled java class into jython environment), but i think that a java class is java class , independently on where is coming from.... So, I dived into the jython code, I commented out these lines from org/python/core/Py.java, in 'initRoot' method (what i commented out has a JAVI label) and now it is working: ThreadState ts = getThreadState(); PyInstance instance = ts.getInitializingProxy(); /* JAVI if (instance != null) { System.out.println("inside returning"); if (instance.javaProxy != null) throw Py.TypeError("Proxy instance reused"); instance.javaProxy = proxy; proxy._setPyInstance(instance); proxy._setPySystemState(ts.systemState); return; } */ System.out.println("module: " + module); PyObject mod; // ??pending: findClass or should avoid sys.path loading? Class modClass = Py.findClass(module+"$_PyInner"); if (modClass != null) { System.err.println("found as class: "+modClass); PyCode code=null; try { code = ((PyRunnable)modClass.newInstance()).getMain(); } catch (Throwable t) { throw Py.JavaError(t); } mod = imp.createFromCode(module, code); } else { mod = imp.importName(module.intern(), false); System.err.println("found as mod: "+mod); } PyClass pyc = (PyClass)mod.__getattr__(pyclass.intern()); instance = new PyInstance(pyc); instance.javaProxy = proxy; proxy._setPyInstance(instance); proxy._setPySystemState(ts.systemState); PyObject[] pargs; if (args == null || args.length == 0) { pargs = Py.EmptyObjects; } else { pargs = new PyObject[args.length]; for(int i=0; i<args.length; i++) pargs[i] = Py.java2py(args[i]); } instance.__init__(pargs, Py.NoKeywords); I guess that the lines i commented out are for performance reasons (without these lines, it would always go to read the _PyInner.class), but for whatever reason, the commented lines are not doing well...... Any idea? Thank you very much in advance. Best regards, Javier. |
From: Samuele P. <ped...@bl...> - 2003-11-11 14:52:27
|
At 14:43 11.11.2003 +0100, Javier Corrales wrote: >I thought that i could not do this (i mean, i could not use a jythonc-compiled >java class into jython environment), but i think that a java class is java >class >, independently on where is coming from.... well is not explicitly supported. >Any idea? a minimal example showing the problem would be useful. regards. |
From: Javier C. <ja...@sr...> - 2003-11-11 15:36:55
|
Samuele Pedroni wrote: > > a minimal example showing the problem would be useful. > The Average.py class that is to be compiled by jythonc: ############################################ from java.lang import Object; class Average(Object): def hello(self): print "hola" def execute(self, ds, pepe): "@sig public java.lang.Float execute(java.lang.String ds, java.lang.Float pepe)" print "execute" self.hello() return 34.5 ############################################## A little java app to test the problem (rea method is working, but inter method is working only when i comment Py.java as i told in my previous email): ////////////////////////////////////////////////// import org.python.util.PythonInterpreter; import org.python.core.*; public class Main { public static void main(String []args) throws PyException { rea(); inter(); } public static void rea() { Average a = new Average(); // a.hello(); System.out.println("exec: " + a.execute("pepe", new Float(3.4) ) ); // Average2 b = new Average2(); // System.out.println("exec: " + b.execute("pepe", new Float(3.4) ) ); } public static void inter() { PythonInterpreter interp = new PythonInterpreter(); System.out.println("Hello, brave new world"); interp.exec("from herschel import *"); interp.exec("a = Average()"); // interp.exec("print a.hello()"); interp.exec("print a.execute(\"pepe\", 3)"); PyObject a = interp.get("a"); System.out.println("Goodbye, cruel world"); } } ///////////////////////////////////////////////////////// I hope this can help. Best regards, Javier. |
From: Samuele P. <ped...@bl...> - 2003-11-11 18:06:41
|
At 15:58 11.11.2003 +0100, Javier Corrales wrote: >I hope this can help. ok, I recalled the issues involved, there is no simple solution at this point. The summary is that import A where A is a jythonc compiled class, ought to retrieve the Python class not a the proxy java class. (Btw then for this kind of usage A and its module cannot share the same name) For the moment the way to import such a A (assuming it was in a module with the same name) is something like: def importjyc(cl): try: modclass = java.lang.Class.forName("%s$_PyInner" % cl) except java.lang.ClassNotFoundException: return java.lang.Class.forName(cl) # fallback for pure java classes m = new.module(cl) sys.modules[cl]=m exec modclass().getMain() in m.__dict__ return getattr(m,cl) A=importjyc("A") regards. |