我有一个python程序,它运行在CPython实现上,在其中我必须调用java程序中定义的函数.我怎样才能做到这一点?
能够使用一些java对象会很高兴.
Jython不是一个选择.我必须在CPython中运行python部分.
为复活线程道歉,但我想我有更好的答案:-)
你也可以使用Py4J,它有两个部分:一个在CPython(或任何Python解释器)中运行的库和一个在你想要调用的Java VM上运行的库.
首页上有一个例子和很多文档,但实际上,你只需要从你的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
通过套接字而不是JNI完成通信.
免责声明:我是Py4J的作者
最简单的事情是
为您的java"函数"编写一个简单的CLI.(没有这样的东西,所以我假设你实际上是指Java类的方法函数.)
public class ExposeAMethod { public static void main( String args[] ) { TheClassToExpose x = new TheClassToExpose(); x.theFunction(); } }
编译并构建一个可执行的JAR文件,并将其作为入口点.叫它
ExposeAMethod.jar
从子进程创建的命令中调用它.
import subprocess p = subprocess.Popen("java -jar ExposeAMethod.jar", shell=True) sts = os.waitpid(p.pid, 0)
这是最低限度.它真的不多.我算了6行java,3行Python,你就开始运行了.
如果要将参数传递给此Java类构造函数或方法函数,则必须编写更多代码行.你有两个选择.
从stdin读取参数,在stdout上写入结果.这相对简单,表现非常好.
将参数解析为Java的命令行选项,在stdout上写入结果.这稍微难一些,但很好地概括.奖励是您现在拥有一个可以重用的有用的命令行Java程序.
如果你不想写自己的JNI/C路线.
另一个选择是使用jpype,对我来说总是我用来访问Oracle数据库,因为在PC上安装oracle c驱动程序是一个皮塔饼.你可以做(从文档):
from jpype import * startJVM("d:/tools/j2sdk/jre/bin/client/jvm.dll", "-ea") # or path to your jvm java.lang.System.out.println("hello world") shutdownJVM()
它暂时没有更新,文档的方式也不多,但它确实运行得相当好.
主页
文档