【问题标题】:Calling jython script from java从java调用jython脚本
【发布时间】:2023-03-06 01:13:02
【问题描述】:

我目前正在使用 jython 和 java 编写一个简单的 hello world 程序。

该程序的设计方式是 jython 方法接受名称参数并返回欢迎消息。

我的问题是每当我从 java 访问 jython 方法时,它都会显示 nullponter 异常

我的 jython 脚本 (JythonHello.py):

class JythonHello:
    def __init__(self, name):
        self.name = name   
    def sayHello(self):
        return "Hello "+ self.name

还有我的java代码:

public static void main(String[] args) {

    PythonInterpreter interpreter = new PythonInterpreter();
    interpreter.execfile("src/jython/JythonHello.py");

    PyObject callFunction = interpreter.get("sayHello");
    PyObject result = callFunction.__call__(new PyString("Boban"));
    String msg = (String) result.__tojava__(String.class);
    System.out.println("output: " + msg);
}

有什么建议吗?

【问题讨论】:

  • 是的。添加异常堆栈跟踪。仅作记录:您确定“src/....”是您调用 java main 的有效路径?
  • 它只显示 java.lang.NullPointerException。我不确定路径。还有其他加载脚本文件的方法吗?
  • 但是确定有行号,方法名?!
  • java.lang.NullPointerException at javaSide.JavaClass.main(JavaClass.java:16)
  • PyObject 结果错误 = callFunction.__call__(new PyString("Boban"));

标签: java jython


【解决方案1】:

查看您的代码;你的 python 代码定义了一个类和一个成员方法:

class JythonHello:
  def __init__(self, name): ...
  def sayHello(self): ...

而且您似乎打算调用 那个 方法:

 PyObject callFunction = interpreter.get("sayHello");
 PyObject result = callFunction.__call__(new PyString("Boban"));

但请注意:sayHello() 不接受 任何 参数。该 self 参数表明您必须在对象上调用它;但没有任何其他参数!

所以,在纯 python 中你会说:

helloVar = JythonHello("Boban")
helloVar.sayHello()

但是你的 java 代码试图像这样调用它

sayHello("Boban")

所以,真正的答案是:退后一步;并重新考虑您真正打算做什么;然后编写以这种方式工作的代码。

我会从不在 python 端添加“类”部分开始;而是尝试简单地调用一个以字符串参数为例的函数!

最后:会不会是你完全走错了路? jython 的主要 点是编写简单的python 代码来在正在运行的JVM 中进行“调试”工作。另一方面,您正在编写复杂的 Java 代码以使用一些 python 代码...

【讨论】:

  • 我想如果你有像 Java 这样的东西 - 更难,但更高效 + Python - 更容易,效率更低,这个想法是在 Java 中实现核心功能,并在 Python 中编写扩展,所以,你真的确定 jython 的重点是调试吗?
  • @user7185318 嗯,它在 my 上下文中 ;-)
猜你喜欢
  • 1970-01-01
  • 2014-02-22
  • 2011-02-09
  • 2012-01-14
  • 1970-01-01
  • 2010-09-18
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多