【问题标题】:How to call a python method from a java class?如何从java类调用python方法?
【发布时间】:2026-01-27 10:30:01
【问题描述】:

我在 Java 项目中使用 Jython。

我有一个 Java 类:myJavaClass.java 和一个 Python 类:myPythonClass.py

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

Python文件如下:

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

现在的问题是我想从我的 Java 文件的 myMethod 方法调用我的 Python 文件的 abc() 方法并打印结果。

【问题讨论】:

标签: java python methods jython


【解决方案1】:

如果我没看错the docs,你可以直接使用eval函数:

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

或者如果你想得到一个字符串:

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

如果您想为它提供一些来自 Java 变量的输入,您可以预先使用 set,然后在 Python 代码中使用该变量名:

interpreter.set("myvariable", Integer(21));
PyObject answer = interpreter.eval("'the answer is: %s' % (2*myvariable)");
System.out.println(answer.toString());

【讨论】:

  • 所以我需要一行代码如:interpreter.eval("myPythonClass().abc(myvariable)");
  • @ashti:是的,这将提供myvariable 作为您类的abc 方法的参数。我添加了另一个示例来演示如何使用新创建的变量。
  • 非常感谢您提供的有用信息。问题解决了!
  • @hasti:在这种情况下,您将被邀请通过单击左侧的勾号来接受答案;)
  • 抱歉,我这样做的声誉很低。您还可以帮我在 java 中将 PyObject 转换为布尔类型吗?
【解决方案2】:

如果我们需要运行一个有参数的python函数并返回结果,我们只需要打印这个:

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是python模块somme_x_y.py中的函数

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

【讨论】:

    【解决方案3】:

    没有任何方法可以做到这一点(据我所知)。

    不过,您确实有几个选择:

    1) 像这样在 java 中执行 python:

    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) 您也许可以使用Jython,它是“用 Java 编写的 Python 编程语言的实现”,从那里您可能会更幸运地做您想做的事。

    3) 你可以让两个应用程序以某种方式通信,使用套接字或共享文件

    【讨论】:

    • 他已经在使用PythonInterpreter,这是一个Jython class
    • 哦,那Python标签很混乱。
    • 这是为什么呢? Jython Python 的一个实现。不过,我在问题中添加了 [jython] 标签。
    【解决方案4】:

    您可以download here Jython 2.7.0 - 独立 Jar。

    然后……

    1. 将此添加到您在 Eclipse 中的 java 路径中......
    2. 在 Package Explorer(左侧)中,右键单击您的 Java 项目并选择 Properties。
    3. 在左侧的树形视图中,选择 Java Build Path。
    4. 选择库选项卡。
    5. 选择添加外部 JAR...
    6. 浏览到您的 Jython 安装(我是 C:\jython2.5.2),然后选择 jython.jar。
    7. 点击应用并关闭。

    那么……

    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`
    

    【讨论】: