2011-02-05 73 views
1

我想实现我用Java编写的Python代码,并且我想使用Jython。有许多网站提供了有关如何构建Jython对象工厂的信息,但所有示例都使用Python类。例如:在Jython中使用python文件是否需要python类?

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

但是,我没有用我的代码类。也就是说,我有许多文件,每个文件都包含几个函数定义,但没有类。因此,我想知道是否有人可以将我指向资源,或者提供有关是否可以使用Jython在没有类的情况下弥合Java和Python之间的差距的信息。

谢谢。

+1

你真的不能编写Java代码不类。你写的所有东西都是静态方法吗?即使在Java中这些静态方法也属于一个类。 – Pace 2011-02-05 12:45:29

回答

3

如果我理解你正确地问什么(我想你想调用Java代码中Python函数),我认为这是可能的。

这是完全未经测试,有点投机,但它看起来像Jython提供一个Java对象模型,让你做你想做什么。这里要理解的重要一点是,Python将函数存储为每个模块(Python文件)的字典属性。因此,在纯Python,一个可以获取和使用功能os.path.join()做这样的事情:

import os 
getattr(getattr(os, 'path'), 'join').__call__('.', 'directory') 

周围没有最Python的语法,但我认为这有助于澄清如何使用PyObject界面加载的调用来自Python模块的Python函数。

要做到这一点从Java似乎你需要遵循一个模式类似于列表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对象返回。

希望,这足够你指出在这个正确的方向。