问题
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:
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());
回答2:
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
回答3:
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
回答4:
You can download here Jython 2.7.0 - Standalone Jar.
Then ...
- add this to your java path in eclipse......
- In the Package Explorer (on the left), right click on your Java project and select Properties.
- In the treeview on the left, select Java Build Path.
- Select the Libraries tab.
- Select Add External JARs...
- Browse to your Jython installation (C:\jython2.5.2 for me), and select jython.jar.
- 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`
来源:https://stackoverflow.com/questions/9381906/how-to-call-a-python-method-from-a-java-class