【问题标题】:Run a python function with arguments from java using jython使用 jython 运行带有来自 java 的参数的 python 函数
【发布时间】:2019-07-05 05:09:37
【问题描述】:

我想使用 jython 执行一个 Python 函数,该函数位于我的 java 项目之一中。 https://smartbear.com/blog/test-and-monitor/embedding-jython-in-java-applications/ 正在为此目的提供示例代码。但在我的场景中,我遇到了以下异常。

线程“main” Traceback 中的异常(最近一次调用最后一次):文件 “”,第 1 行,在 ImportError 中:没有命名的模块 JythonTestModule

我的场景如下。

  1. 我使用 PyCharm(JythonTestModule.py) 在我的 python 项目(pythonDev) 中创建了一个 python 模块,其中包含以下函数。

    def 平方(值): 返回值*值

  2. 然后我在我的 java 项目(javaDev)中创建了一个示例 java 类并调用了 python 模块。

    public static void main(String[] args) throws PyException{
       PythonInterpreter pi = new PythonInterpreter();
       pi.exec("from JythonTestModule import square");
       pi.set("integer", new PyInteger(42));
       pi.exec("result = square(integer)");
       pi.exec("print(result)");
       PyInteger result = (PyInteger)pi.get("result");
       System.out.println("result: "+ result.asInt());
       PyFunction pf = (PyFunction)pi.get("square");
       System.out.println(pf.__call__(new PyInteger(5)));
    }     
    

    运行此 java 方法后,java 程序会生成上述异常。我想知道这个提到的代码段有什么问题。

【问题讨论】:

  • 找不到 JythonTestModule。 JythonTestModule.py 是否与 Java 项目位于同一目录中?它很可能是在错误的目录中查找模块。
  • (我不声称知道答案,但是)。由于JythonTestModule 是您的模块,您如何确保解释器知道它?它在哪里寻找系统模块以外的模块?
  • @M.Goodman,我认为他只需要将解释器的python.path 属性设置为他的基本目录。
  • @ShanChathusandaJayathilaka,也许this reference 有帮助?
  • 我会这么认为。我不确定。

标签: java python jython jython-2.7


【解决方案1】:

根据该问题上述 cmets 部分的建议,我已经开发了解决问题的方法。以下代码段将证明这一点。在这个解决方案中,我将 python.path 设置为我的模块文件的目录路径。

public static void main(String[] args) throws PyException{
       Properties properties = new Properties();
       properties.setProperty("python.path", "/path/to/the/module/directory");
       PythonInterpreter.initialize(System.getProperties(), properties, new String[]{""});
       PythonInterpreter pi = new PythonInterpreter();
       pi.exec("from JythonTestModule import square");
       pi.set("integer", new PyInteger(42));
       pi.exec("result = square(integer)");
       pi.exec("print(result)");
       PyInteger result = (PyInteger)pi.get("result");
       System.out.println("result: "+ result.asInt());
       PyFunction pf = (PyFunction)pi.get("square");
       System.out.println(pf.__call__(new PyInteger(5)));
    }

如果您想使用 Jython 中的多个模块,请将 python.path 添加为 所有模块的父目录路径为了检测所有的模块。

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 1970-01-01
    • 2012-05-18
    • 2016-04-03
    • 2020-03-29
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 2021-02-06
    相关资源
    最近更新 更多