在 Eclipse 中使用 Pydev 开发了一个包含 Jython 脚本的 Java 项目。现在想在另一个纯 Python 项目中重用此脚本。如何在不复制脚本的情况下干净地做到这一点?
目前有一个包含 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 项目中。
目前看到的选项,都不喜欢:
- 复制 MyJythonCode.py 并同时修改它们。
- 执行一些时髦的 svn:externals 操作,以便在每次更新时自动进行复制。
- 尝试查找一个 Eclipse 的预构建/自定义构建步骤插件来执行复制操作。
有没有更好的主意?
2. 解决方案
创建一个独立的 Jython 模块,可以从 Java 和 Python 项目中导入。
- 在 Eclipse 中创建一个新的 Pydev/Jython 项目,并将其命名为“MyJythonModule”。
- 在新项目中创建一个名为“module.py”的文件,并在其中放置 Jython 代码。
- 在 Java 项目中,右键单击项目,然后选择“Pydev”>“Add Pydev Project as a Reference”。
- 在“Add Pydev Project as a Reference”对话框中,选择“MyJythonModule”项目,然后单击“OK”。
- 在 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);
}
}
这种方法的好处是:
- Jython 代码位于一个单独的模块中,可以很容易地从任何 Java 或 Python 项目中导入。
- Jython 代码与 Java 代码解耦,因此可以独立地进行开发和维护。
- 可以使用 Eclipse 的 Pydev 插件对 Jython 代码进行调试和测试。