2013-12-24 2 views
4

Я хочу назвать Java из питона с библиотекой Py4J,Как позвонить Java из питона с помощью PY4J

from py4j.java_gateway import JavaGateway 
gateway = JavaGateway()      # connect to the JVM 
gateway.jvm.java.lang.System.out.println('Hello World!') 

Я получил следующее сообщение об ошибке: «Py4JNetworkError: Произошла ошибка при попытке подключиться к Java сервер». Кажется, что JVM не работает, как это исправить?

+0

Дон» t вам нужно имя хоста и/или порт для подключения к REMOTE JVM? – iWumbo

ответ

1
package test.test; 

import py4j.GatewayServer; 

public class AdditionApplication { 
    public int addition(int first, int second) { 
     return first + second; 
     } 

     public static void main(String[] args) { 
     AdditionApplication app = new AdditionApplication(); 
     // app is now the gateway.entry_point 
     GatewayServer server = new GatewayServer(app); 
     server.start(); 
     } 
} 

создать новый класс и запустить его (импорт py4j0.8.jar на 'py4j-0,8 \ py4j-0,8 \ py4j-ява' первый), а затем запустить программу питона

0

Сначала вы должны запустить java-программу, а затем вызвать java-метод из python.

py4j не запускает jvm, он просто подключается к уже запущенному Java-процессу.

4

Минимальный рабочий пример:

//AdditionApplication.java 
import py4j.GatewayServer; 

public class AdditionApplication { 

    public static void main(String[] args) { 
    AdditionApplication app = new AdditionApplication(); 
    // app is now the gateway.entry_point 
    GatewayServer server = new GatewayServer(app); 
    server.start(); 
    } 
} 

Compile (убедитесь, что -cp путь к py4j действует, в противном случае настроить его таким образом, чтобы она указывала на нужное место):

javac -cp /usr/local/share/py4j/py4j0.9.jar AdditionApplication.java

Выполнить это:

java -cp .:/usr/local/share/py4j/py4j0.9.jar AdditionApplication

Теперь, если вы запустите ваш питон скрипт, в терминале, где Java AdditionApplication запущен, вы должны увидеть что-то вроде:

>>> Hello World!

+0

Я думаю, что вы подразумеваете ';' не ':' в своем пути к классу. – SRKX

+1

Зависит от используемой вами платформы. ':' в UNIX или ';' в Windows. Немного больше информации по этой теме можно найти здесь (http://stackoverflow.com/questions/29623328/why-is-file-pathseparatorchar-a-semicolon-on-windows). –