我正在尝试实现我用Java编写的Python代码,我想使用Jython。有许多网站提供有关如何构建Jython对象工厂的信息,但所有示例都使用Python类。例如:
但是,我没有在我的代码中使用类。也就是说,我有一些文件,每个文件包含几个函数定义,但没有类。因此,我想知道是否有人可以指向我的资源或提供有关是否可以使用Jython来弥补Java和Python之间的差距而无需使用类的信息。
感谢。
答案 0 :(得分:3)
如果我理解你正确的问题(我认为你想从Java代码调用Python函数),我认为这是可能的。
这是完全未经测试的,有点推测,但看起来Jython提供了一个Java对象模型,可以让你做你想要的。这里要理解的重要一点是,Python将函数存储为每个模块(Python文件)的字典属性。因此,在纯Python中,可以使用函数os.path.join()
来执行类似的操作:
import os
getattr(getattr(os, 'path'), 'join').__call__('.', 'directory')
不是最常用的Pythonic语法,但我认为它有助于阐明如何使用PyObject接口从Python模块加载调用Python函数。
要从Java执行此操作,您似乎需要遵循类似于List 10-5 in the section of the Jython book you linked to的模式。在第一个构造函数中,是一个如何导入Python类(也存储为Python模块的属性)的示例。稍微修改一下,你最终会得到类似的东西:
class PythonExecutor {
public static void main(String...args) {
String moduleName = "...";
String functionName = "...";
PyObject importer = state.getBuiltins().__getitem__(Py.newString("__import__"));
// module = __import__(moduleName)
PyObject module = importer.__call__(Py.newString(moduleName));
// function = getattr(module, functionName)
PyObject function = module.__getattr__(functionName);
// function.__call__()
function.__call__();
}
}
当然,您已经可以从上面的代码片段中看到Java与动态语言相比的一些缺点。如果您的Python函数需要任何类型的参数,这一点尤其严重,因为任何Java对象都需要编组到PyObjects中。同样,the listing mentioned above有几个使用java2py() method of the Py class将Java对象转换为Python对象的示例。同样,如果您的Python函数返回某种结果,您可能需要使用__tojava__()
function on PyObject将其转换为Java对象。
要处理所有这些细节,可能值得花时间为需要从Java代码访问的Python模块构建Java adapter,类似于JythonObjectFactory提供的几种转换方法的方式将Java对象转换为Python对象,在Python类上调用__init__()
方法,并将结果作为Java对象返回。
希望,这足以让你指出正确的方向。