// MyPythonObject.java
import org.python.core.PyObject;
import org.python.expose.ExposedClassMethod;
import org.python.expose.ExposedType;
@ExposedType
public class MyPythonObject extends PyObject {
@ExposedClassMethod
public void hello() {
System.out.println("Hello");
}
}
// Main.java
import org.python.core.PyStringMap;
import org.python.util.PythonInterpreter;
public class Main {
public static void main(String[] args) throws Exception {
PythonInterpreter.initialize(null, null, new String[0]);
PyStringMap map = new PyStringMap();
PythonInterpreter pythonInterpreter = new PythonInterpreter(map);
map.__setitem__("myobj", new MyPythonObject());
pythonInterpreter.exec("myobj.hello()");
}
}
The code runs fine on Jython 2.7.1 but fails on Jython 2.7.2:
Exception in thread "main" Traceback (most recent call last):
File "<string>", line 1, in <module>
AttributeError: 'null' object has no attribute 'hello'
Is this a bug in Jython 2.7.2?
P.S. I asked the same question on GitHub but didn't get any answer yet.
david.perez has asked the right question. The exposer annotations are used to create built-in Python objects in the interpreter. They add code to methods when processed during the Jython build, in classes that will act like a Python built-in.
You do not need them simply to use a class defined in Java from a program written in Python. Take them off and your code works.
I don't know what changed from 2.7.1 to move exposer annotations from unnecessary to harmful. (ASM update, maybe.)