我有一个jar形式的java库,可用于从文件中提取数据(excel,xml等)。正如它在java中一样,它只能在java应用程序中使用。但是我需要同样的库来用于python项目。 我试过py4j等从jvm获取对象。但该库不是可执行文件,不会“运行”。我已经检查过Jython,但我需要可以从Python项目访问该库。 我曾考虑过将自动java用于python翻译器,但我认为这是最后的选择。
请提出一些我可以做到这一点的方法。
答案 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步:按
安装py4jpip 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