Excellent, thanks Andi.
Mike
Andi Vajda wrote:
On Tue, 3 Feb 2009, Michael McCandless wrote:
One quick question about PyLucene/JCC: is it "symmetric" at runtime,
ie, my "main" could be in Java and I can init access to Python and
then invoke Python sources?
EG maybe I created a Python function for indexing a bunch of files,
but
the rest of my app in in Java, so I want to create my writer in
Java, pass
it to the Python function, and then continue using the writer in
Java.
(I realize JCC allows subclassing of Java classes to in Python, eg
the
Analyzers examples).
Yes, you can do this (embed a Python VM in a Java VM) if your JCC-
built extension is built with shared mode, using --shared.
I use this reverse embedding when running Python code inside Tomcat,
for example.
In order to access Python code from Java you have to:
1. write a Java class that declares the 'native' methods that JCC
is going
to hook into (and generate code for) to invoke your Python code
2. write a Python class that 'extends' this Java class.
(see
http://lucene.apache.org/pylucene/jcc/documentation/readme.html#extensions)
3. be sure to have the path to the JCC's libjcc.so on -D
java.library.path
and the resulting egg on your CLASSPATH
4. initialize the Python VM from Java (this part is not yet
documented as
this is a rather new feature, actually):
import org.apache.jcc.PythonVM;
import your.fancy.extension;
....
PythonVM.start(programName /* a String, decoration really */,
args /* a String[] passed to Python's init);
....
vm = PythonVM.get();
/* here, in instantiate, we're referring to your python class as
in: from your.fancy import extension
*/
ext = (your.fancy.extension)
vm.instantiate("your.fancy", "extension");
... use the ext instance as any other Java object ...
Andi..