两种方式,java<=>python,使用py4j进行通信

2024-09-27 07:26:54 发布

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

我使用py4j实现python和java之间的通信,能够从java端调用python方法。但从python我不能发送任何对象或调用java方法。这是我试过的密码。在

我的java代码:

public interface IHello {
    public String sayHello();

    public String sayHello(int i, String s);

//    public String frompython();

}

//ExampleClientApplication.java
package py4j.examples;

import py4j.GatewayServer;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class ExampleClientApplication extends Thread {

public void run(){
    System.out.println("thread is running...");
}

public static void main(String[] args) {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    GatewayServer.turnLoggingOff();
    GatewayServer server = new GatewayServer();
    server.start();
    IHello hello = (IHello) server.getPythonServerEntryPoint(new Class[] { IHello.class });
    try {
        System.out.println("Please enter a string");
        String str = br.readLine();
        System.out.println(hello.sayHello(1, str));
    } catch (Exception e) {
        e.printStackTrace();
    }
    ExampleClientApplication t1 = new ExampleClientApplication();
    t1.start();
    //server.shutdown();
  }
}

我的python代码:

^{pr2}$

Tags: importnewstringserverjavapublicoutsystem
1条回答
网友
1楼 · 发布于 2024-09-27 07:26:54

发送对象问题很容易解决,方法是在java接口中实现一个getter/eval方法,该方法由python实现,然后可以从java调用该方法来获取所请求的变量。对于一个示例,请看一下py4j实现:https://github.com/subes/invesdwin-context-python

具体地看这里的get/eval方法实现:https://github.com/subes/invesdwin-context-python/blob/master/invesdwin-context-python-parent/invesdwin-context-python-runtime-py4j/src/main/java/de/invesdwin/context/python/runtime/py4j/pool/internal/Py4jInterpreter.py

另一方面,您必须对java网关类执行相同的操作,并提供一个可以从python调用的get/eval方法。实际的java代码可以在groovy的ScriptEngine中执行,结果可以返回给python。(见http://docs.groovy-lang.org/1.8.9/html/groovy-jdk/javax/script/ScriptEngine.html

虽然最好是决定主/从角色,只需输入参数一次,然后在python中执行代码并检索结果一次。或者相反,如果python应该领先。这样可以大大减少通信开销。为了实现更紧密的集成,而不会像py4j那样造成性能损失,您应该看看https://github.com/mrj0/jep直接将python库加载到java进程中。那么每次通话都不再那么贵了。在

相关问题 更多 >

    热门问题