gpt4 book ai didi

java - 从 Java 调用 python 模块

转载 作者:太空狗 更新时间:2023-10-29 21:11:11 25 4
gpt4 key购买 nike

我想使用“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

我面临的问题是当我调用 interpreter.get 时它返回一个空 PyObject。

知道出了什么问题吗? 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. 您不能在 PythonInterpreter.get 中使用 python 属性访问.只需使用属性名称来获取模块,并从中检索属性。
  2. (编辑部分)Python 代码完全损坏。请参阅下面的正确示例。当然,www.python.org .
  3. (编辑部分)PyInstance.invoke 的第一个参数应该是方法名。
  4. 您可以在下面找到两种情况的工作代码示例

主.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"

你好_world2.py

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

def get_name(self):
return self.world

关于java - 从 Java 调用 python 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22697315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com