如何在Python和Java项目中通过Pydev/Eclipse共享Python/Jython代码?
我在一个Java项目中使用了嵌入的Jython脚本,这个项目是在Eclipse中开发的,并且安装了Pydev。现在我想把这个脚本在另一个纯Python项目中重用。有没有什么好的方法可以做到这一点,而不需要复制脚本呢?
目前,我的Java项目中有两个目录:src/
(里面是Java源代码)和src-py/
(里面是Jython源代码),并且添加了Pydev的“facet”。Java代码通过类似下面的方式调用Jython代码:
// evaluate the Jython class
PythonInterpreter interpreter = new PythonInterpreter();
InputStream resourceAsStream = MyEclipsePlugin.getResource("/src-py/MyJythonCode.py");
interpreter.execfile(resourceAsStream);
// create an instance of the Jython class and retrieve a Java interface reference to it
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的事情,让它在每次更新时自动复制。
- 尝试找一个预构建的或自定义构建步骤的插件来做复制。
有没有人有更好的主意?
1 个回答
我觉得正确的做法是为这些内容创建一个单独的项目,这样这两个项目都可以依赖这个新项目。
也就是说:
先创建一个Java项目,然后再给它添加pydev的属性(也就是:右键点击这个项目 > 选择pydev > 设为pydev项目)。
接着,在这个项目里你可以创建你的Java包装类,并且为pydev配置源路径(还可以把这个项目作为引用添加到其他项目中:右键点击其他项目 > 属性 > 项目引用)。
这样一来,Java和Python的内容就都能正常工作了。