Python調(diào)用Jar包的兩種方式小結(jié)
概覽
因工作場景,需要在python代碼里調(diào)用Jar包來實(shí)現(xiàn)一些功能,調(diào)研下來主要有兩種方式:
java -jar xx.jar
JPype
環(huán)境配置
因?yàn)橐诠緝?nèi)網(wǎng)操作,所以需要通過離線方式進(jìn)行安裝。環(huán)境用的是一個(gè)Centos7.7的docker鏡像。
安裝JDK
主要有三種方式:
- 1. 通過yum源安裝
- 2. rpm安裝
- 3. 解壓JDK安裝包手動(dòng)安裝
第一種方式需要聯(lián)網(wǎng)或者配置內(nèi)網(wǎng)的yum源
第三種方式比較繁瑣且需要配置環(huán)境變量,相較而言第二種方式比較適合我這一次的場景
具體安裝細(xì)節(jié)不再贅述,詳情可參考這篇文章:CentOS安裝jdk的幾種方法及配置環(huán)境變量
安裝JPype(如需要)
同樣的,可以通過pip直接在線安裝,也可以通過python setup.py install或者pip install xx.whl離線安裝,可參考Python安裝包的三種方式
JPype安裝包和文檔可以通過官方github 或者官方PyPi獲取。
調(diào)用示例
java -jar
import os import subprocess import jpype import time def query_by_java_jar(jar_path, param): ? ? execute = "java -jar {} '{}'".format(jar_path, param) ? ? # print(execute) ? ? output = subprocess.Popen(execute, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) ? ? res = output.stdout.readlines() ? ? return res
JPype
import os import subprocess import jpype import time def query_by_jpype(jar_path, some_param): ? ? if not jpype.isJVMStarted(): ? ? ? ? jpype.startJVM(classpath=[jar_path]) ? ? if not jpype.isThreadAttachedToJVM(): ? ? ? ? jpype.attachThreadToJVM() ? ? try: ? ? ? ? java_class = jpype.JClass('com.xxx.xxx') ? ? ? ? result = java_class.someStaticFunction(some_param) ? ? except Exception as e: ? ? ? ? print(e) ? ? ? ? result = None ? ? finally: ? ? ? ? #jpype.shutdownJVM() ? ? ? ? return result
再多說一點(diǎn)
關(guān)于JPype
- 具體的使用場景和方法,可參考Github里的UserGuide
- shutdown之后再start報(bào)錯(cuò):OSError: JVM cannot be restarted
這是JPype的一個(gè)使用限制,為防止內(nèi)存泄漏的,同一進(jìn)程內(nèi)關(guān)閉JVM后無法再次啟動(dòng)。
可考慮將調(diào)用方法寫入到一個(gè)Python腳本,然后通過subprocess去調(diào)用。
官方解釋此處也在貼一下:
JPype Known limitations
Restarting the JVM
JPype caches many resources to the JVM. Those resource are still allocated after the JVM is shutdown as there are still Python objects that point to those resources. If the JVM is restarted, those stale Python objects will be in a broken state and the new JVM instance will obtain the references to these resulting in a memory leak. Thus it is not possible to start the JVM after it has been shut down with the current implementation.
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python數(shù)據(jù)分析之雙色球中藍(lán)紅球分析統(tǒng)計(jì)示例
這篇文章主要介紹了Python數(shù)據(jù)分析之雙色球中藍(lán)紅球分析統(tǒng)計(jì),結(jié)合實(shí)例形式較為詳細(xì)的分析了Python針對雙色球藍(lán)紅球中獎(jiǎng)數(shù)據(jù)分析的相關(guān)操作技巧,需要的朋友可以參考下2018-02-02將Python腳本通過Wooey轉(zhuǎn)化為Web應(yīng)用的簡易解決方案
Wooey 是一個(gè)開源的 Python 項(xiàng)目,旨在幫助開發(fā)者快速將 Python 腳本轉(zhuǎn)化為用戶友好的 Web 應(yīng)用程序,在本文中,我們將詳細(xì)介紹 Wooey 的功能、安裝與配置方法,并展示如何將一個(gè) Python 腳本通過 Wooey 轉(zhuǎn)化為 Web 應(yīng)用,需要的朋友可以參考下2025-05-05對python實(shí)時(shí)得到鼠標(biāo)位置的示例講解
今天小編就為大家分享一篇對python實(shí)時(shí)得到鼠標(biāo)位置的示例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10詳解Selenium如何使用input標(biāo)簽上傳文件完整流程
這篇文章主要介紹了詳解Selenium如何使用input標(biāo)簽上傳文件完整流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05Python實(shí)現(xiàn)自動(dòng)批量修改文件名稱
這篇文章主要為大家詳細(xì)介紹了如何基于Python語言,實(shí)現(xiàn)按照一定命名規(guī)則批量修改多個(gè)文件的文件名的效果,文中的示例代講解詳細(xì),感興趣的可以了解一下2023-01-01Python如何精準(zhǔn)判斷某個(gè)進(jìn)程是否在運(yùn)行
這篇文章主要為大家詳細(xì)介紹了Python如何精準(zhǔn)判斷某個(gè)進(jìn)程是否在運(yùn)行,本文為大家整理了3種方法并進(jìn)行了對比,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-04-04