我使用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}$
发送对象问题很容易解决,方法是在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进程中。那么每次通话都不再那么贵了。在
相关问题 更多 >
编程相关推荐