Невозможно запустить шлюз из Python в py4j

Я пытаюсь запустить JavaGateway со стороны Python, используя py4j. Вот минимальный набор файлов, необходимых для воспроизведения проблемы, с которой я столкнулся.

py4j.Py4JException: Target Object ID does not exist for this gateway :t

A.java

public class A {
}

EntryPoint.java

import py4j.GatewayServer;

public class EntryPoint {
    public A getA() {
        return new A();
    }

    public static void main(String[] args) {
        GatewayServer gatewayServer = new GatewayServer(new EntryPoint());
        gatewayServer.start();
        System.out.println("server started");
    }
}

Я использую IntelliJ для создания файла .jar, где основным классом является EntryPoint, а py4j.jar включен в качестве зависимости.

Теперь я пытаюсь запустить шлюз, указав путь к созданному файлу .jar в python.

test.py

from py4j.java_gateway import JavaGateway

gateway = JavaGateway.launch_gateway(classpath = '../out/artifacts/debugPy4j_jar/debugPy4j.jar')

a = gateway.entry_point.getA()

Будем очень признательны за любые советы по решению этой проблемы.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
850
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете указать собственный основной класс с launch_gateway, что означает, что вы не можете указать точку входа. Вы можете указать только путь к классам, который добавляется к пути к файлу jar Py4J.

«t» - это имя точки входа на стороне Java: поскольку точки входа нет, Py4J не может найти объект «t». Эта деталь реализации, вероятно, не должна попадать в исключительную ситуацию, с которой сталкивается пользователь.

launch_gateway жестко запрограммирован на использование py4j.GatewayServer в качестве основного класса, поскольку он ожидает, что сторона Java будет вести себя определенным образом.

В вашем случае вы все равно можете создать экземпляр EntryPoint из Python после запуска GatewayServer:

from py4j.java_gateway import JavaGateway

gateway = JavaGateway.launch_gateway(classpath='../out/artifacts/debugPy4j_jar/debugPy4j.jar')

a = gateway.jvm.A()

Не могли бы вы привести пример? Я не слишком знаком с py4j

Carpetfizz 15.07.2018 22:43

Я добавил пример

Barthelemy 16.07.2018 02:55

Поправьте меня, если я ошибаюсь, но это не запускает сам сервер шлюза, верно? Как это до сих пор работает?

Carpetfizz 16.07.2018 17:34

Кроме того, означает ли это, что EntryPoint.java не нужен? Разве я не могу просто создать артефакт с A.java и использовать его в качестве пути к классам?

Carpetfizz 16.07.2018 17:40

launch_gateway запускает JVM и GatewayServer. EntryPoint.java не нужен, да.

Barthelemy 16.07.2018 23:34

Как пройти callback_server_parameters?

Carpetfizz 10.08.2018 02:35

Другие вопросы по теме