我有一个python应用程序和Java应用程序。 python应用程序为java应用程序生成输入并在命令行上调用它。
我确信必须有一个更优雅的解决方案;就像使用JNI从Java调用C代码一样。
任何指针? (仅供参考,我是Python的新手)
澄清(以长期问题为代价:道歉) py app(我不拥有)以许多配置文件的形式获取用户输入。然后它通过插件机制将这些和农场工作转移到许多(隐藏的)工具上。我希望添加对旧版Java应用程序提供的功能的支持。
因此从java应用程序调用python应用程序是没有意义的,我无法在jython环境中(在JVM上)运行py app。
由于没有明显的机制,我认为简单的CL调用是最好的解决方案。
答案 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可以使用的通信协议:
选择您或您的合作伙伴所熟悉的内容!
答案 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声明。