使用python中的java库(java包的Python包装器)

时间:2012-08-21 09:47:32

标签: java python

我有一个jar形式的java库,可用于从文件中提取数据(excel,xml等)。正如它在java中一样,它只能在java应用程序中使用。但是我需要同样的库来用于python项目。 我试过py4j等从jvm获取对象。但该库不是可执行文件,不会“运行”。我已经检查过Jython,但我需要可以从Python项目访问该库。 我曾考虑过将自动java用于python翻译器,但我认为这是最后的选择。

请提出一些我可以做到这一点的方法。

3 个答案:

答案 0 :(得分:2)

在从Python发送通知之前,你可以创建一个永不结束的一个java程序。

这样lib就可以保存在内存中,并可以从Python程序中访问。

这个类可能是这样的(添加你需要的lib import / init):

public class TestPy {

    private Thread thread;

    public void die() {
        synchronized (thread) {
            thread.interrupt();
        }    
    }

    public TestPy() {
        thread = new Thread(){
            public void run() {
                try {
                    while (!Thread.interrupted()) {
                        Thread.sleep(500);
                    }
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        };
        thread.start();    
    }

    public static void main(String[] args) {
        TestPy tp = new TestPy();
        GatewayServer server = new GatewayServer(tp);
        server.start();
    }
}

你必须启动java程序,使用lib,然后使用die()方法杀死Python中的java程序:

gateway = JavaGateway()
do your stuff here using the lib
tp = gateway.entry_point
tp.die()

答案 1 :(得分:2)

您可以编写一个简单的命令行Java程序,该程序调用库并以Python中可读取的格式保存结果,然后您可以使用os.system从Python调用该程序。

另一种选择是找到与Java库具有相同功能的Python库:您可以在Python中读取excel,xml和其他文件,这不是问题。

答案 2 :(得分:0)

我还没有学习如何通过java构造函数在jar文件中创建java类的新实例,但是偶然发现使用任何java静态方法来访问py2j中的java对象非常容易。

第1步:从https://pypi.python.org/pypi/py4j下载py4j zip文件。 “py4j0.10.0.jar”在zip文件中。

第2步:按

安装py4j
pip install 'D:\Downloads\py4j-0.10.0.zip'

第3步:添加py4j0.10.0.jar以及the_lib_you_use.jar(如下例中的owlapi-distribution-3.5.0.jar),在eclipse项目中构建路径

步骤4:创建AdditionApplication.java,并在https://www.py4j.org/复制并粘贴AdditionApplication.java的代码,然后运行Java应用程序AdditionApplication.java

步骤5:运行AdditoinApplication.java后,在python文件中测试示例代码:

if __name__ == '__main__':
    pass

from py4j.java_gateway import JavaGateway
gateway = JavaGateway()                   # connect to the JVM

random = gateway.jvm.java.util.Random()   # create a java.util.Random instance
number1 = random.nextInt(10)              # call the Random.nextInt method
number2 = random.nextInt(10)
print(number1,number2)
(2, 7)
addition_app = gateway.entry_point        # get the AdditionApplication instance
addition_app.addition(number1,number2)    # call the addition method


Math = gateway.jvm.java.lang.Math
a = Math.max(4, 6);
print a

IRI = gateway.jvm.org.semanticweb.owlapi.model.IRI

abcIRI = IRI.create('fewf#fe')
print 'abcIRi = ' + str(abcIRI)
print 'abcIRI.getFragment() = ' + abcIRI.getFragment()

控制台上的结果是:

(5, 0)
6
abcIRi = fewf#fe
abcIRI.getFragment() = fe