我必须使用商业Java库,想要从Python中使用。Jython稳定可靠,即使版本稍落后也没关系。然而,我希望也能使用NumPy,但这显然与Jython不兼容。CPype和Java数值库等选项并不理想。前者已经基本停止维护。后者大多都还不够成熟,缺乏NumPy易用性和广泛接受程度。我的问题是:如何实现Jython和Python代码之间的互操作?对我来说,从Cpython调用Jython或者反过来都可以接受。
我必须使用商业Java库,想要从Python中使用。Jython稳定可靠,即使版本稍落后也没关系。然而,我希望也能使用NumPy,但这显然与Jython不兼容。CPype和Java数值库等选项并不理想。前者已经基本停止维护。后者大多都还不够成熟,缺乏NumPy易用性和广泛接受程度。我的问题是:如何实现Jython和Python代码之间的互操作?对我来说,从Cpython调用Jython或者反过来都可以接受。
我非常期待Jython C扩展API的推出!那将是很棒的!
在那之前,我认为你有两个选择:
http://jepp.sourceforge.net/ 用于在Java中嵌入Python,它有一个不错的控制台。缺点是需要针对自己的Python进行编译。随着Python升级,您必须重新编译(我不想编译Python,以便编译和使用扩展 - 这也是不可能的,特别是如果代码应在不同的机器上执行,例如在网格上)
http://lucene.apache.org/pylucene/jcc/ - 用于Lucene和许多其他项目。我个人使用它来包装GATE NLP引擎和Solr,以使其可用于Python。 Jcc比(已死)JPype快得多,可能是因为一些数据结构(如列表)被优化,并且还因为它通过C ++扩展与Python<->java接口(根据此:http://www.slideshare.net/onyame/mixing-python-and-java第30页)。我尝试在Python和Java之间移动600万个整数列表,JPype的速度慢了几个数量级(但我不记得数字)
然而,使用Jcc,您只能包装公共方法,有时会很棘手,特别是如果该方法接收或返回某些Java对象(简而言之,JCC还必须为传入的对象编译包装器,否则所有使用/返回此类方法的方法都无法访问)。因此,除非您需要分发代码,否则最好使用JEPP。