在Jython中使用python文件是否需要python类?

时间:2011-02-05 10:12:34

标签: java python jython

我正在尝试实现我用Java编写的Python代码,我想使用Jython。有许多网站提供有关如何构建Jython对象工厂的信息,但所有示例都使用Python类。例如:

http://jythonpodcast.hostjava.net/jythonbook/en/1.0/JythonAndJavaIntegration.html#using-jython-within-java-applications

但是,我没有在我的代码中使用类。也就是说,我有一些文件,每个文件包含几个函数定义,但没有类。因此,我想知道是否有人可以指向我的资源或提供有关是否可以使用Jython来弥补Java和Python之间的差距而无需使用类的信息。

感谢。

1 个答案:

答案 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对象返回。

希望,这足以让你指出正确的方向。