在 Python 和 Java 项目之间共享通用的 Python/Jython 代码

85 阅读2分钟

在 Eclipse 中使用 Pydev 开发了一个包含 Jython 脚本的 Java 项目。现在想在另一个纯 Python 项目中重用此脚本。如何在不复制脚本的情况下干净地做到这一点?

huake_00063_.jpg 目前有一个包含 src/(包含 Java 源代码)和 src-py/(包含 Jython 源代码)目录的 Java 项目,并添加了 Pydev “facet”。Java 代码通过如下方式调用 Jython 代码:

// 评估 Jython 类
PythonInterpreter interpreter = new PythonInterpreter();
http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取;
InputStream resourceAsStream = MyEclipsePlugin.getResource("/src-py/MyJythonCode.py");
interpreter.execfile(resourceAsStream);

// 创建 Jython 类的实例并检索其 Java 接口引用
interpreter.exec("x = MyJythonClass()");   // MyJythonClass implements MyJavaInterface
Object x = interpreter.get("x").__tojava__(MyJavaInterface.class);
return (MyJavaInterface) x;

这种方法可行,但显然非常丑陋。据了解,曾经有一个“jythonc”,可能更接近所需的内容,但它似乎已被弃用,不建议使用。没有它,需要在运行时获取 Jython 源代码才能将其编译为 JVM 类。因此,上述模式似乎不支持加载模块,因此只能在一个 .py 文件中处理所有内容。最终可以执行 interpreter.execfile() 多次,但还没有真正弄清楚如何在模块之间存在相互依赖时做到这一点。

接下来,尝试创建一个新的 Jython 项目以将 MyJythonCode.py 移入其中。遗憾的是,无法将 Pydev/Jython 项目作为项目引用添加到 Java 项目中,因此不确定如何将其集成到 Java 项目中。

目前看到的选项,都不喜欢:

  1. 复制 MyJythonCode.py 并同时修改它们。
  2. 执行一些时髦的 svn:externals 操作,以便在每次更新时自动进行复制。
  3. 尝试查找一个 Eclipse 的预构建/自定义构建步骤插件来执行复制操作。

有没有更好的主意?

2. 解决方案

创建一个独立的 Jython 模块,可以从 Java 和 Python 项目中导入。

  1. 在 Eclipse 中创建一个新的 Pydev/Jython 项目,并将其命名为“MyJythonModule”。
  2. 在新项目中创建一个名为“module.py”的文件,并在其中放置 Jython 代码。
  3. 在 Java 项目中,右键单击项目,然后选择“Pydev”>“Add Pydev Project as a Reference”。
  4. 在“Add Pydev Project as a Reference”对话框中,选择“MyJythonModule”项目,然后单击“OK”。
  5. 在 Java 代码中,导入“module.py”并使用它。
import org.python.util.PythonInterpreter;

public class JavaMain {

    public static void main(String[] args) {
        PythonInterpreter interpreter = new PythonInterpreter();
        interpreter.execfile("module.py");

        // 调用 Python 模块中的函数
        Object result = interpreter.get("add", 1, 2).__tojava__(Integer.class);
        System.out.println(result);
    }
}

这种方法的好处是:

  1. Jython 代码位于一个单独的模块中,可以很容易地从任何 Java 或 Python 项目中导入。
  2. Jython 代码与 Java 代码解耦,因此可以独立地进行开发和维护。
  3. 可以使用 Eclipse 的 Pydev 插件对 Jython 代码进行调试和测试。