10

I am using Jython within a Java project.

I have one Java class: myJavaClass.java and one Python class: myPythonClass.py

public class myJavaClass{
    public String myMethod() {
        PythonInterpreter interpreter = new PythonInterpreter();
        //Code to write
    }
 }

The Python file is as follows:

class myPythonClass:
    def abc(self):
        print "calling abc"
        tmpb = {}
        tmpb = {'status' : 'SUCCESS'}
        return tmpb

Now the problem is I want to call the abc() method of my Python file from the myMethod method of my Java file and print the result.

1

4 Answers 4

16

If I read the docs right, you can just use the eval function:

interpreter.execfile("/path/to/python_file.py");
PyDictionary result = interpreter.eval("myPythonClass().abc()");

Or if you want to get a string:

PyObject str = interpreter.eval("repr(myPythonClass().abc())");
System.out.println(str.toString());

If you want to supply it with some input from Java variables, you can use set beforehand and than use that variable name within your Python code:

interpreter.set("myvariable", Integer(21));
PyObject answer = interpreter.eval("'the answer is: %s' % (2*myvariable)");
System.out.println(answer.toString());
8
  • so do I need to have a line of code such as: interpreter.eval("myPythonClass().abc(myvariable)");
    – Hasti
    Commented Feb 21, 2012 at 17:30
  • @ashti: Yeah, that would supply myvariable as an argument to the abc method of your class. I added another example to demonstrate how to use that newly created variable.
    – Niklas B.
    Commented Feb 21, 2012 at 17:32
  • Thank you very much for your helpful information. Problem solved!
    – Hasti
    Commented Feb 21, 2012 at 18:21
  • @hasti: In that case you are invited to accept the answer by clicking at the tick on the left side ;)
    – Niklas B.
    Commented Feb 21, 2012 at 18:22
  • Sorry but my reputation is low to do so. Also could you help me in converting PyObject to boolean type in java?
    – Hasti
    Commented Feb 21, 2012 at 20:47
3

If we need to run a python function that has parameters, and return results, we just need to print this:

import org.python.core.PyObject;
import org.python.core.PyString;
import org.python.util.PythonInterpreter;

public class method {

public static void main(String[] args) {

    PythonInterpreter interpreter = new PythonInterpreter();
    interpreter.execfile("/pathtoyourmodule/somme_x_y.py");
    PyObject str = interpreter.eval("repr(somme(4,5))");
    System.out.println(str.toString());

}

somme is the function in python module somme_x_y.py

def somme(x,y):
   return x+y
1
  • whats repr refering to ?
    – aΨVaN
    Commented May 19, 2022 at 5:18
1

There isn't any way to do exactly that (that I'm aware of).

You do however have a few options:

1) Execute the python from within java like this:

try {
    String line;
    Process p = Runtime.getRuntime().exec("cmd /c dir");
    BufferedReader bri = new BufferedReader(new InputStreamReader(p.getInputStream()));
    BufferedReader bre = new BufferedReader(new InputStreamReader(p.getErrorStream()));
    while ((line = bri.readLine()) != null) {
        System.out.println(line);
    }
    bri.close();
    while ((line = bre.readLine()) != null) {
        System.out.println(line);
    }
    bre.close();
    p.waitFor();
    System.out.println("Done.");
}
catch (Exception err) {
    err.printStackTrace();
}

2) You can maybe use Jython which is "an implementation of the Python programming language written in Java", from there you might have more luck doing what you want.

3) You can make the two applications communicate somehow, with a socket or shared file

3
  • He is already using PythonInterpreter, which is a Jython class.
    – Niklas B.
    Commented Feb 21, 2012 at 17:22
  • Oh, the Python tag is confusing then. Commented Feb 21, 2012 at 17:27
  • Why is that? Jython is an implementation of Python. Nevertheless, I added the [jython] tag to the question.
    – Niklas B.
    Commented Feb 21, 2012 at 17:33
0

You can download here Jython 2.7.0 - Standalone Jar.

Then ...

  1. add this to your java path in eclipse......
  2. In the Package Explorer (on the left), right click on your Java project and select Properties.
  3. In the treeview on the left, select Java Build Path.
  4. Select the Libraries tab.
  5. Select Add External JARs...
  6. Browse to your Jython installation (C:\jython2.5.2 for me), and select jython.jar.
  7. Click apply and close.

Then...

Java class (main) //use your won package name and python class dir
-----------------
package javaToPy;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;

public class JPmain {

    @SuppressWarnings("resource")
    public static void main(String[] args) {

    PythonInterpreter interpreter = new PythonInterpreter();

    //set your python program/class dir here
    interpreter.execfile
    ("C:\\Users\\aman0\\Desktop\\ME\\Python\\venv\\PYsum.py");

    PyObject str1 = interpreter.eval("repr(sum(10,50))");
    System.out.println(str1.toString());

    PyObject str2 = interpreter.eval("repr(multi(10,50))");
    System.out.println(str2.toString());


    interpreter.eval("repr(say())");


    interpreter.eval("repr(saySomething('Hello brother'))");

}

}

---------------------------
Python class
------------

def sum(x,y):
    return x+y

def multi(a,b):
    return a*b

def say():
    print("Hello from python")

def saySomething(word):
    print(word)`enter code here`

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.