From: Morten W. <Mor...@st...> - 2003-05-19 07:41:33
|
hello, im not sure this is the right mail address to write to (but it does say email us on the homepage :-)) i have been searching for a way to do the following: 1) have some python code in a file. 2) at runtime, read the file and put the code in a class that implements a java interface 3) comple the class and let the jvm load it, so i could use it as a normal class. is this possible at all? and if it is how? i guess the end result would be like using the jython interpreter, but without the interpretation overhead. sincerely morten wilken |
From: Ype K. <yk...@xs...> - 2003-05-21 18:06:03
|
Morten, On Monday 19 May 2003 00:25, Morten Wilken wrote: > hello, > > im not sure this is the right mail address to write to (but it does say > email us on the homepage :-)) > > i have been searching for a way to do the following: > > > 1) have some python code in a file. > 2) at runtime, read the file and put the code in a class that implement= s a > java interface > 3) comple the class and let the jvm load it, so i could use it as a nor= mal > class. > > is this possible at all? and if it is how? Like almost everyting in python, importing happens at runtime. Do you mean that you generate python code from a python program, and then you want to import this code as a python module? This can be done by: exec "from %s import %s" % (generatedModuleName, className) The interesting detail is that Jython works in the same way as CPython here, ie. you don't need Jython/Java specific python code. Have fun, Ype |
From: Oti <oh...@ya...> - 2003-05-21 22:06:44
|
[ Morten Wilken ] > 1) have some python code in a file. > 2) at runtime, read the file and put the code in a class that > implements a > java interface > 3) comple the class and let the jvm load it, so i could use it as a > normal > class. Morten, please find an example below. Hopefully it is what you were looking for. The java interface: package test; public interface MyInterface { public Number getNumber(String start); } The small.py file containing a class implementing the java interface (should be on python.path): from test import MyInterface from java.lang import Integer class implementation(MyInterface): def getNumber(self, start): return Integer(len(start)) A java class to get instances of the implementation: package test; import org.python.core.Py; import org.python.core.PyObject; import org.python.core.PySystemState; import org.python.core.imp; public class MyInterfaceFactory { private PyObject _classObject; public MyInterfaceFactory() { String module = "small"; // module (=file) on python.path String clazz = "implementation"; // class in the module PySystemState.initialize(); PyObject moduleObject = imp.importName(module, false); if (moduleObject != null) { _classObject = moduleObject.__getattr__(clazz); // AttributeError if not found } else { throw Py.ImportError("unable to import " + module); } } public MyInterface getInstance() { return (MyInterface) _classObject.__call__().__tojava__(MyInterface.class); } } Use it as follows: package test; public class MyInterfaceTest { public static void main(String args[]) { String start = ""; if (args.length > 0) start = args[0]; MyInterfaceFactory factory = new MyInterfaceFactory(); MyInterface myInterface = factory.getInstance(); Number result = myInterface.getNumber(start); System.out.println("result = " + result); } } Finally, calling the test program: java test.MyInterfaceTest hey result = 3 > i guess the end result would be like using the jython interpreter, > but > without the interpretation overhead. In my example, the file is interpreted only once, but you can create any number of instances of MyInterface. Best wishes, Oti. __________________________________ Do you Yahoo!? The New Yahoo! Search - Faster. Easier. Bingo. http://search.yahoo.com |