Open pont-us opened 4 years ago
Here's a minimal Java source file to reproduce the problem.
package test.jpysegfault;
import org.jpy.PyLib;
import org.jpy.PyObject;
import java.util.Map;
public class Main {
public static void main(String[] args) {
System.setProperty("jpy.pythonLib",
"/home/pont/miniconda3/envs/jpy-38/lib/libpython3.8.so");
System.setProperty("jpy.jpyLib",
"/home/pont/loc/repos/jpy/build/lib.linux-x86_64-3.8/jpy.cpython-38-x86_64-linux-gnu.so");
System.setProperty("jpy.jdlLib",
"/home/pont/loc/repos/jpy/build/lib.linux-x86_64-3.8/jdl.cpython-38-x86_64-linux-gnu.so");
PyLib.startPython();
final Map<PyObject, PyObject> globalsDict = PyLib.getMainGlobals().asDict();
for (Map.Entry<PyObject, PyObject> entry : globalsDict.entrySet()) {
System.out.println("Entry: " + entry.getKey() + " -> " + entry.getValue());
}
PyLib.stopPython();
}
}
Attached: log file generated by running the test script above with JPy_DiagFlags = JPy_DIAG_F_ALL
set in src/main/c/jpy_diag.c
.
@pont-us I came across this bug. Are you aware of any workaround? Thanks!
This bug manifested itself as a failure of the unit test
PyObjectTest.testDictCopy()
. It can also be triggered by the following minimal snippet (Python 3.8, 64-bit Ubuntu Linux 20.04) (after setting the necessary jpy configuration properties and callingPyLib.startPython()
):The iteration succeeds for two loops, printing
Entry: __name__ -> __main__
andEntry: __doc__ -> None
. At the start of the third iteration it crashes with a segmentation fault. The culprit appears to bebuiltins.call("next", it)
in the iterator returned byPyDictWrapper.EntrySet.iterator()
. This calls through toPyObject.call()
. The control flow continues intoPyLib_CallAndReturnObject
inorg_jpy_PyLib.c
, and eventually to this line:It is this call to PyObject_CallObject in Python's C API which directly triggers the segmentation fault.