This release is compatible with Python 2.7, 3.3, 3.4, 3.5, 3.6, 3.7, and 3.8. It is compatible with Java versions >= 1.7. This will be the last release to support Python 2 and the last release to support Java 1.7. It may also be the last release to support Python 3.3, 3.4, and 3.5.
If you are using a feature that we have deprecated or removed, and the javadoc does not explain a suitable alternative, please notify us. If you are still using Jep with Python 3.3, Python 3.4, or Python 3.5, please notify us.
A new interface jep.Interpreter and new class jep.SubInterpreter are provided to better distinguish a SubInterpreter from a SharedInterpreter. The use of the interface also allows a developer to more quickly switch between the concrete types for testing which interpreter to use. Where possible a developer should strive to use the interface and only specify the implementation at construction. Alongside this change, many methods on the Jep class have been deprecated in preparation for a future release.
The numpy types float64, float32, int64, int32, int16, and int8 can now be converted to the appropriate java.lang equivalents of Double, Float, Long, Integer, Short, and Byte, respectively.
Jep now supports executing multiple Python statements from a single Java String using the new Jep.exec(String) method which works similar to the Python builtin exec(string).
The class MainInterpreter now supports specifying an absolute path from which the jep library (libjep.so, libjep.dll, libjep.jnilib) will be loaded. Using this method will take precedence over other methods of finding the location of the library.
Python objects that implement the Buffer Protocol can now be converted into Java arrays.
The java.nio classes ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, and ShortBuffer can be wrapped as PyJObjects. If they are direct (i.e. use direct memory) they can share memory with Python objects through the use of the Python Buffer Protocol.
PyCallable has new methods callAs(Class, args) where the return object will match the expected type, the Class argument. Contributed by Jeremy Smith.
A method PyObject.as(Class) has been that will use Jep's builtin conversions to return a Java representation of the PyObject.
PyObject has a new method proxy(Class, Class...) that provides creation of a Proxy to a Python object that matches a Java interface. These interfaces only work correctly if the Python method names match the Java method names, but they can be used to invoke Python methods from Java. For example, a Java interface DataFrame could be used to invoke methods on a Python pandas DataFrame, if the Java interface had some or all of the methods on a pandas DataFrame.
In previous versions of Jep numpy scalar conversion was platform dependent. On some platforms a numpy int32 and a float32 would be converted to a java.lang Long and Double, respectively. In this version the conversion is consistent across platforms, a numpy.int32 will default to a java.lang.Integer and a numpy.float32 will default to a java.lang.Float. The old conversions are still possible if they are explicitly needed. For example a Java method taking a Double can still take a numpy.float32, however a Java method taking an Object or Number will now get a Float whereas previously it might be a Double.
The set(args) methods on PyObject have been removed in favor of using setAttr(String, Object).
The Jep classes implementing the javax.script classes have been removed.