4

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

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

4

3 回答 3

2

您可以制作一个线程永不结束的一类 Java 程序,直到您从 Python 发送通知以执行此操作。

这样,lib 将保存在内存中,并可从您的 Python 程序访问。

这个类可能是这样的(添加你需要的库导入/初始化):

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()
于 2012-08-21T09:50:43.020 回答
2

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

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

于 2012-08-21T09:56:00.037 回答
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 项目中构建路径

第四步:创建AdditionApplication.java,将AdditionApplication.java的代码复制粘贴到https://www.py4j.org/,运行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
于 2016-04-27T06:31:14.680 回答