从Java调用python模块

时间:2014-03-27 19:27:22

标签: java python

我想使用" PythonInterpreter"从Java调用python模块中的函数。这是我的Java代码

PythonInterpreter interpreter = new PythonInterpreter();

interpreter.exec("import sys\nsys.path.append('C:\\Python27\\Lib\\site-packages')\nimport helloworld");

PyObject someFunc = interpreter.get("helloworld.getName");

PyObject result = someFunc.__call__();

String realResult = (String) result.__tojava__(String.class);

System.out.println(realResult);

和Python代码(helloworld.py)如下:

    from faker import Factory
    fake = Factory.create()

    def getName():
       name = fake.name()
       return name  

我遇到的问题是在我返回null PyObject时调用interpreter.get。

知道出了什么问题吗? python代码从IDLE

运行良好

修改

我刚刚对代码进行了一些更改,如下所示

PythonInterpreter interpreter = new PythonInterpreter();

interpreter.exec("import sys\nsys.path.append('C:\\Python27\\Lib\\site-packages')\nimport helloworld");


PyInstance wrapper = (PyInstance)interpreter.eval("helloworld" + "(" + ")");  

PyObject result = wrapper.invoke("getName()");

String realResult = (String) result.__tojava__(String.class);

System.out.println(realResult);

我在我的python模块中引入了一个类

from faker import Factory

class helloworld:

def init(self):
    fake = Factory.create()

def getName():
    name = fake.name()
    return name 

现在我收到错误

Exception in thread "main" Traceback (innermost last):
  File "<string>", line 1, in ?
TypeError: call of non-function (java package 'helloworld')

1 个答案:

答案 0 :(得分:1)

  1. 您无法在PythonInterpreter.get中使用python属性访问权限。只需使用属性名称来获取模块,并从中检索属性。
  2. (编辑部分)Python代码完全破碎。请参阅下面的正确示例。当然还有www.python.org
  3. (编辑部分)PyInstance.invoke的第一个参数应该是方法名称。
  4. 您可以在下面找到两种情况的工作代码示例
  5. Main.java

    import org.python.core.*;
    import org.python.util.PythonInterpreter;
    
    public class Main {
    
        public static void main(String[] args) {
            test1();
            test2();
        }
    
        private static void test1() {
            PythonInterpreter interpreter = new PythonInterpreter();
            interpreter.exec("import hello_world1");
            PyObject func = interpreter.get("hello_world1").__getattr__("get_name");
            System.out.println(func.__call__().__tojava__(String.class));
        }
    
        private static void test2() {
            PythonInterpreter interpreter = new PythonInterpreter();
            interpreter.exec("from hello_world2 import HelloWorld");
            PyInstance obj = (PyInstance)interpreter.eval("HelloWorld()");
            System.out.println(obj.invoke("get_name").__tojava__(String.class));
        }
    }
    

    hello_world1.py

    def get_name():
        return "world"
    

    hello_world2.py

    class HelloWorld:
        def __init__(self):
            self.world = "world"
    
        def get_name(self):
            return self.world