如何从CPython调用java对象和函数?

2024-04-29 04:34:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python程序,它运行在CPython实现上,在它里面我必须调用java程序中定义的函数。我该怎么做?

能够使用一些java对象也很好。

Jython不是一个选择。我必须在CPython中运行python部分。


Tags: 对象函数程序定义jythonjavacpython
3条回答

最简单的事情就是

  1. 为java“函数”编写一个简单的CLI。(没有这样的东西,所以我假设您实际上是指Java类的方法函数。)

    public class ExposeAMethod {
        public static void main( String args[] ) {
             TheClassToExpose  x = new TheClassToExpose();
            x.theFunction();
        }
    }
    
  2. 编译并构建一个可执行的JAR文件,以此作为入口点。称之为 ExposeAMethod.jar

  3. 从子流程创建的命令调用此命令。

    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,对我来说,jpype一直是访问Oracle数据库的工具,因为在PC上安装Oracle c驱动程序是一个pita。 你可以做(从文档中)这样的事情:

 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()

它已经有一段时间没有更新了,也没有太多的文档,但它确实工作得相当好。

很抱歉让这根线复活,但我想我有更好的答案:-)

您还可以使用Py4J,它有两个部分:一个运行在CPython中的库(或者任何Python解释器)和一个运行在您要调用的Java VM上的库。

在frontpage上有一个例子和许多文档,但实际上,您只是从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的作者

相关问题 更多 >