You can call a Python method from Java by implementing a Java interface on the python side.

The steps are:

  1. Create an interface in Java, e.g., py4j.examples.Operator
  2. In Python, create a class and inside the class, create a Java class with an "implements" field.
  3. In Python, instantiate a gateway with start_callback_server=True, e.g., gateway = JavaGateway(start_callback_server=True)
  4. In Python, instantiate the class implementing a Java interface and send it to the Java side.
  5. In Java, call the interface.

Example adapted from the Py4J documentation:

Java code:

// File 1
package py4j.examples;

public interface Operator {
        public int doOperation(int i, int j);
        public int doOperation(int i, int j, int k);
}

// File 2
package py4j.examples;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import py4j.GatewayServer;

public class OperatorExample {

    // To prevent integer overflow
    private final static int MAX = 1000;

    public List<Integer> randomBinaryOperator(Operator op) {
        Random random = new Random();
        List<Integer> numbers = new ArrayList<Integer>();
        numbers.add(random.nextInt(MAX));
        numbers.add(random.nextInt(MAX));
        numbers.add(op.doOperation(numbers.get(0), numbers.get(1)));
        return numbers;
    }
}

Python code:

from py4j.java_gateway import JavaGateway

class Addition(object):
    def doOperation(self, i, j, k = None):
        if k == None:
            return i + j
        else:
            return i + j + k

    class Java:
        implements = ['py4j.examples.Operator']

if __name__ == '__main__':
    gateway = JavaGateway(start_callback_server=True)
    operator = Addition()
    operator_example = gateway.jvm.py4j.examples.OperatorExample()

    # "Sends" python object to the Java side.
    numbers = operator_example.randomBinaryOperator(operator) 
Answer from Barthelemy on Stack Overflow
🌐
GitHub
github.com › py4j › py4j
GitHub - py4j/py4j: Py4J enables Python programs to dynamically access arbitrary Java objects · GitHub
Py4J enables Python programs running in a Python interpreter to dynamically access Java objects in a Java Virtual Machine. Methods are called as if the Java objects resided in the Python interpreter and Java collections can be accessed through ...
Starred by 1.3K users
Forked by 231 users
Languages   Java 63.1% | Python 34.8%
🌐
Py4j
py4j.org
Welcome to Py4J — Py4J
Py4J also enables Java programs to call back Python objects. Py4J is distributed under the BSD license. Here is a brief example of what you can do with Py4J. The following Python program creates a java.util.Random instance from a JVM and calls some of its methods.
🌐
GitHub
gist.github.com › bartdag › 1070311
Java and Python and Py4J · GitHub
August 24, 2017 - I recently just came across the problem of starting python process from Java. And What i did was using runtime.getRuntime.exec() to launch a new python process to create the JavaGateway, and the rest of it would be same of tutorial on websites, which is just start the Gatewayserver in the following java code. At the very end I would destroy the python process. However, it throws an error: py4j.Py4JException: Error while obtaining a new communication channel at py4j.CallbackClient.getConnectionLock(CallbackClient.java:218) at py4j.CallbackClient.sendCommand(CallbackClient.java:337) at py4j.Call
🌐
Manmustbecool
manmustbecool.github.io › MyWiki › Wiki › Python › python_java.html
Call Java from Python
from py4j.java_gateway import JavaGateway gateway = JavaGateway() # connect to the JVM random = gateway.jvm.java.util.Random() # create a java.util.Random instance number1 = random.nextInt(10) # call the Random.nextInt method print(number1) AdditionApplication addition_app = new gateway.jvm.AdditionApplication() # get the AdditionApplication instance value = addition_app.addition(4, 5)) # call the addition method print(value)
Top answer
1 of 1
13

You can call a Python method from Java by implementing a Java interface on the python side.

The steps are:

  1. Create an interface in Java, e.g., py4j.examples.Operator
  2. In Python, create a class and inside the class, create a Java class with an "implements" field.
  3. In Python, instantiate a gateway with start_callback_server=True, e.g., gateway = JavaGateway(start_callback_server=True)
  4. In Python, instantiate the class implementing a Java interface and send it to the Java side.
  5. In Java, call the interface.

Example adapted from the Py4J documentation:

Java code:

// File 1
package py4j.examples;

public interface Operator {
        public int doOperation(int i, int j);
        public int doOperation(int i, int j, int k);
}

// File 2
package py4j.examples;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import py4j.GatewayServer;

public class OperatorExample {

    // To prevent integer overflow
    private final static int MAX = 1000;

    public List<Integer> randomBinaryOperator(Operator op) {
        Random random = new Random();
        List<Integer> numbers = new ArrayList<Integer>();
        numbers.add(random.nextInt(MAX));
        numbers.add(random.nextInt(MAX));
        numbers.add(op.doOperation(numbers.get(0), numbers.get(1)));
        return numbers;
    }
}

Python code:

from py4j.java_gateway import JavaGateway

class Addition(object):
    def doOperation(self, i, j, k = None):
        if k == None:
            return i + j
        else:
            return i + j + k

    class Java:
        implements = ['py4j.examples.Operator']

if __name__ == '__main__':
    gateway = JavaGateway(start_callback_server=True)
    operator = Addition()
    operator_example = gateway.jvm.py4j.examples.OperatorExample()

    # "Sends" python object to the Java side.
    numbers = operator_example.randomBinaryOperator(operator) 
🌐
PyPI
pypi.org › project › py4j
py4j · PyPI
Py4J also enables Java programs to call back Python objects.
      » pip install py4j
    
Published   Jan 15, 2025
Version   0.10.9.9
🌐
Py4j
py4j.org › advanced_topics.html
3. Advanced Topics — Py4J
In the following example, the Java side is initiating the conversation by making the first call to the Python side. If the call is initiated from a UI thread, then all subsequent call from Python to Java will be executed in the Java UI thread.
🌐
Py4j
py4j.org › getting_started.html
2. Getting Started with Py4J — Py4J
Finally, you need to start the gateway so it can accept incoming Python requests: ... You are now ready to try your Java program.
🌐
Stack Overflow
stackoverflow.com › questions › 44149878 › both-ways-java-python-communication-using-py4j
Both ways, java <=> python, communication using py4j - Stack Overflow
The send objects problem is easily solved by implementing a getter/eval method in the java interface that is implemented by python, which can then be called from java to get the variable that is requested. For an example have a look at the py4j implementation here: https://github.com/subes/invesdwin-context-python
Find elsewhere
🌐
PyPI
pypi.org › project › jtypes.py4j
jtypes.py4j · PyPI
Py4J also enables Java programs to call back Python objects.
      » pip install jtypes.py4j
    
Published   Nov 13, 2018
Version   0.10.8a1
🌐
GitHub
github.com › makefile › py4j-rpc
GitHub - makefile/py4j-rpc: Run Python code in Java through RPC way.
Py4j-RPC is a simple bridge that enables Java VM call Python codes through TCP connection between Java and python side.
Author   makefile
🌐
GitHub
gist.github.com › bartdag › 0a6043a62e12f0e53ae296c112786ac7
Py4J - Multiple GatewayServer and CallbackServer instances · GitHub
Compile and run TestApplication.java with py4j.jar in your classpath. ... This creates three pairs of GatewayServer and CallbackServer with different ports on both the Java and Python sides.
🌐
GitHub
github.com › py4j › py4j › blob › master › py4j-python › src › py4j › java_gateway.py
py4j/py4j-python/src/py4j/java_gateway.py at master · py4j/py4j
November 20, 2015 - from py4j.version import __version__ · · class NullHandler(logging.Handler): def emit(self, record): pass · · · null_handler = NullHandler() logging.getLogger("py4j").addHandler(null_handler) logger = logging.getLogger("py4j.java_gateway") · BUFFER_SIZE = 4096 · DEFAULT_ADDRESS = "127.0.0.1" DEFAULT_PORT = 25333 · DEFAULT_PYTHON_PROXY_PORT = 25334 · DEFAULT_ACCEPT_TIMEOUT_PLACEHOLDER = "DEFAULT" DEFAULT_CALLBACK_SERVER_ACCEPT_TIMEOUT = 5 ·
Author   py4j
🌐
GitHub
github.com › py4j › py4j › blob › master › setup.py
py4j/setup.py at master · py4j/py4j
# For Python 3 compatibility, we can't use execfile; this is 2to3's conversion: exec(compile(open(VERSION_PATH).read(), VERSION_PATH, "exec")) VERSION = __version__ # noqa · RELEASE = "py4j-" + VERSION · JAR_FILE = "py4j" + VERSION + ".jar" · os.chdir("py4j-java") if os.name == "nt": subprocess.call("./gradlew.bat buildPython", shell=True) else: subprocess.call("./gradlew buildPython", shell=True) os.chdir("..") ·
Author   py4j
🌐
Myrobotlab
myrobotlab.org › service › Py4j
Py4j | MyRobotLab
Py4J also enables Java programs to call back Python objects. Py4J is distributed under the BSD Python 2.7 -to- 3.x is supported to use you will need the py4j lib in your python application.
🌐
GitHub
github.com › sagarlakshmipathy › Py4J
GitHub - sagarlakshmipathy/Py4J: A Simple Py4J implementation
from py4j_example.app import ApplicationWrapper wrapper = ApplicationWrapper() result = wrapper.subtract(2, 1) print(result) # will output 1 · In addition to the subtract method, you can access other Java objects and methods (native and custom) from Python. For example, to call a Java method named getArrayLength that takes a list of integers as a parameter, you can do the following:
Author   sagarlakshmipathy
🌐
Google Groups
groups.google.com › a › py4j.org › g › py4j › c › SNDBGy_6VPw
Calling python from java : py4j.Py4JException: An exception was raised by the Python Proxy. Return M
Hi Sorry I forgot to include the Python code. here it is... from py4j.java_gateway import JavaGateway import os import sys import powerfactory class ToFromjava(object): def runPowerFactory(): try: pyd_PATH = r'C:/Program Files (x86)/DIgSILENT/PowerFactory 15.1/python' sys.path.append(pyd_PATH) app = powerfactory.GetApplication() app.Show() project = app.ActivateProject("Final project(2)") #Nine Bus System prj = app.GetActiveProject() except ValueError: print("Oops! not a valied call...") class Java: implements = ['repastextrun.javaPyCallInt'] if __name__ == '__main__': logger = logging.getLogger("py4j") logger.setLevel(logging.DEBUG) logger.addHandler(logging.StreamHandler()) gateway = JavaGateway(start_callback_server=True) toFromjava = ToFromjava() toFromjava_ex = gateway.jvm.repastextrun.JavaPyCall() toFromjava_ex.CollectDemandData(toFromjava) Thanks Sudheera
🌐
Ptidej Team Blog
blog.ptidej.net › bridging-the-gap-accessing-java-objects-from-python-and-vice-versa
Mind the Gap: Accessing Java Objects from Python and Vice Versa
May 8, 2024 - First, install Py4J packages for Python and Java by following this documentation. To exchange custom Python objects with Java, the Python classes should implement Java interfaces. This allows the JVM to call Python objects.
🌐
LinuxTut
linuxtut.com › en › e90cbbfdac439e6e9d30
An easy way to call Java from Python
October 9, 2016 - You can now run it consistently with python until the end. It can be used when inheriting a project of a Javer person, when there is a Java library you want to use, or when you want to implement some processing that requires speed in Java. https://www.py4j.org/ https://gist.github.com/bartdag/1070311