Python4J网关接收到的对象类型不正确

2024-09-29 19:25:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Py4J在Python中使用Java回调函数

Java openjdk 11.0.3版

Python3

Py4J 0.10.8.1

我过去曾成功地使用Py4J在Python中使用Java回调函数。但是,我最近添加了一个新的回调类,使用的模式与我以前使用的相同,但是现在我在新类中遇到以下错误。你知道吗

AttributeError: 'JavaMember' object has no attribute '_get_object_id'

为了追踪这个问题,我在 Python。旧类StatusCallback显示对象类型TestsJNI$StatusCallback@548ebebc,而新类显示对象类型<py4j.java_gateway.JavaMember object at 0x7f8dc69817f0>。你知道吗

这就解释了我得到的AttributeError。但是我不明白为什么我没有得到py4j.java_gateway.JavaMember而不是像TestsJNI$UploadCallback这样的东西。你知道吗

Java代码

import py4j.GatewayServer;

public class TestsJNI
{
    public static boolean functionCalled = false;

    public static class UploadCallback
    {
        public static void callback()
        {
            functionCalled = true;
        }

        // I have also tried these functions
        //public static void callback(int a)
        //{
        //  functionCalled = true;
        //}

        //public static void callback(int a, boolean b)
        //{
        //  functionCalled = true;
        //}
    }
    public static UploadCallback uploadCallback = new UploadCallback();

    public static class StatusCallback
    {
        public static void callback()
        {
            functionCalled = true;
        }
    }
    public static StatusCallback statusCallback = new StatusCallback();

    public static void main(String args[])
    {
        TestsJNI testApp = new TestsJNI();

        // Py4J server
        GatewayServer server = new GatewayServer(testApp);
        server.turnLoggingOff();
        server.start();
    }
}

Python代码

from py4j.java_gateway import JavaGateway, GatewayParameters, get_field

javaCmd = ("java -cp /mnt/c/Workspace/tests/java/:.:/home/fred/.local/share/py4j/py4j0.10.8.1.jar TestsJNI")
print(javaCmd)
self.jvmProcess = Popen(javaCmd, shell=True, preexec_fn=os.setsid)
time.sleep(1.0)

# Connect to JVM via Py4J gateway
logging.getLogger("py4j").setLevel(logging.ERROR)
self.gateway = JavaGateway(gateway_parameters=GatewayParameters(auto_field=True))

entryPoint = self.gateway.entry_point
self.jni = entryPoint.autoguidanceJNI
self.jniObj = self.gateway.entry_point

testObj = self.jniObj.uploadCallback
print("upload testObj = " + str(testObj))
ret = False

testObj = self.jniObj.StatusCallback
print("status testObj = " + str(testObj));

Python输出

upload testObj = <py4j.java_gateway.JavaMember object at 0x7f8dc69817f0>
status testObj = TestsJNI$StatusCallback@548ebebc

我的问题

为什么Py4J给我一个py4j.java_gateway.JavaMember对象给UploadCallback类,给我一个TestsJNI$StatusCallback对象给StatusCallback类?你知道吗


Tags: selfstaticjavapublicgatewayvoidpy4jtestobj

热门问题