Python調(diào)用Jar包的兩種方式小結(jié)
概覽
因工作場景,需要在python代碼里調(diào)用Jar包來實現(xiàn)一些功能,調(diào)研下來主要有兩種方式:
java -jar xx.jar
JPype
環(huán)境配置
因為要在公司內(nèi)網(wǎng)操作,所以需要通過離線方式進行安裝。環(huán)境用的是一個Centos7.7的docker鏡像。
安裝JDK
主要有三種方式:
- 1. 通過yum源安裝
- 2. rpm安裝
- 3. 解壓JDK安裝包手動安裝
第一種方式需要聯(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
再多說一點
關(guān)于JPype
- 具體的使用場景和方法,可參考Github里的UserGuide
- shutdown之后再start報錯:OSError: JVM cannot be restarted
這是JPype的一個使用限制,為防止內(nèi)存泄漏的,同一進程內(nèi)關(guān)閉JVM后無法再次啟動。
可考慮將調(diào)用方法寫入到一個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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python數(shù)據(jù)分析之雙色球中藍(lán)紅球分析統(tǒng)計示例
這篇文章主要介紹了Python數(shù)據(jù)分析之雙色球中藍(lán)紅球分析統(tǒng)計,結(jié)合實例形式較為詳細(xì)的分析了Python針對雙色球藍(lán)紅球中獎數(shù)據(jù)分析的相關(guān)操作技巧,需要的朋友可以參考下2018-02-02將Python腳本通過Wooey轉(zhuǎn)化為Web應(yīng)用的簡易解決方案
Wooey 是一個開源的 Python 項目,旨在幫助開發(fā)者快速將 Python 腳本轉(zhuǎn)化為用戶友好的 Web 應(yīng)用程序,在本文中,我們將詳細(xì)介紹 Wooey 的功能、安裝與配置方法,并展示如何將一個 Python 腳本通過 Wooey 轉(zhuǎn)化為 Web 應(yīng)用,需要的朋友可以參考下2025-05-05詳解Selenium如何使用input標(biāo)簽上傳文件完整流程
這篇文章主要介紹了詳解Selenium如何使用input標(biāo)簽上傳文件完整流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05