使用python中的java库

时间:2009-01-25 00:41:22

标签: java python jython

我有一个python应用程序和Java应用程序。 python应用程序为java应用程序生成输入并在命令行上调用它。

我确信必须有一个更优雅的解决方案;就像使用JNI从Java调用C代码一样。

任何指针? (仅供参考,我是Python的新手)

澄清(以长期问题为代价:道歉) py app(我不拥有)以许多配置文件的形式获取用户输入。然后它通过插件机制将这些和农场工作转移到许多(隐藏的)工具上。我希望添加对旧版Java应用程序提供的功能的支持。

因此从java应用程序调用python应用程序是没有意义的,我无法在jython环境中(在JVM上)运行py app。

由于没有明显的机制,我认为简单的CL调用是最好的解决方案。

6 个答案:

答案 0 :(得分:57)

很抱歉重新发布帖子,但没有接受答案......

您也可以使用Py4J。首页上有一个例子和很多文档,但实质上,你只需要从你的python代码中调用Java方法就好像它们是python方法一样:

>>> from py4j.java_gateway import JavaGateway
>>> gateway = JavaGateway()                        # connect to the JVM
>>> java_object = gateway.jvm.mypackage.MyClass()  # invoke constructor
>>> other_object = java_object.doThat()
>>> other_object.doThis(1,'abc')
>>> gateway.jvm.java.lang.System.out.println('Hello World!') # call a static method

与Jython相反,Py4J在Python VM中运行,因此它始终与最新版本的Python“最新”,并且您可以使用在Jython上运行不正常的库(例如,lxml)。通信是通过套接字而不是JNI完成的。

免责声明:我是Py4J的作者

答案 1 :(得分:8)

看看Jython。它有点像JNI,但用Python代替C,即你可以用Java调用Python,反之亦然。目前还没有完全清楚你要做什么,或者为什么你当前的方法不是你想要的。

答案 2 :(得分:5)

将Java代码包装在Container(Servlet / EJB)中。

所以你没有在vm-startup中浪费时间,而是开始更加注重服务。

对于包装你可以使用jython(只有熟悉python才有意义

选择python和java可以使用的通信协议:

  • json(见www.json.org)
  • rmi(Python:JPype)
  • REST
  • SOAP(仅适用于勇者)

选择您或您的合作伙伴所熟悉的内容!

答案 3 :(得分:5)

如果您真的想在Java进程中嵌入Java应用程序,请查看JPype。它通过JNI提供对Java的访问。

答案 4 :(得分:4)

如何使用swig:http://www.swig.org/Doc1.3/Java.html

答案 5 :(得分:2)

尝试JCC http://pypi.python.org/pypi/JCC/2.1

JCC是一个直接从CPython调用Java的代码生成器。它支持OS X,Linux,Solaris和Windows上的CPython 2.3+,几个JRE(Sun JDK 1.4 +,Apple JRE 1.4+和OpenJDK 1.7)。它由开源应用程序基金会(OSAF,人员制作Chandler)制作,并以Apache风格的许可证发布。

来自包装说明:

  

JCC是一个C ++代码生成器,用于生成通过Java的本机调用接口(JNI)从CPython调用Java类所需的粘合代码。

     

JCC生成C ++包装类,隐藏JNI访问的所有细节,以及Java内存和对象引用管理。

     

JCC生成CPython类型,使这些C ++类可以从Python解释器访问。 JCC试图通过检测迭代器和属性访问器来使这些Python类型变为pythonic。迭代器和映射也可以向JCC声明。