python工具庫介紹-jpype:python到java橋
簡介
Python 作為一種靈活的軟體開發語言在當今被廣泛使用。在軟體開發過程中,有時需要在 Python 專案中利用既有的 Java 程式碼,已達到節省時間和開發成本的目的。因此,找到一個 Python 程式碼呼叫 Java 程式碼的橋樑是非常有意義的。 JPype 就是這樣的一個工具,利用它可以使 Python 程式方便的呼叫 Java 程式碼。
JPype使Python可以完全訪問Java類庫。Jython/JPython重新實現了Python,JPype則提供了兩個虛擬機器的介面。JPype可以在JSP,Servlet、RMI伺服器和IDE外掛都方面用Python代替Java。
缺陷:
package之外的類(在<default>中)不能被匯入。
不能重啟JVM。
不能處理依賴當前類的方法。
快速入門
- 安裝
#!python # pip3 install jpype1 Collecting jpype1 Downloading JPype1-0.6.2.tar.gz (147kB) 100% |████████████████████████████████| 153kB 519kB/s Building wheels for collected packages: jpype1 Running setup.py bdist_wheel for jpype1 ... done Stored in directory: /root/.cache/pip/wheels/8e/f3/e6/a1250b8e8d2bd105f4dd21b1dc801dbcf5d815592443bfe741 Successfully built jpype1 Installing collected packages: jpype1 Successfully installed jpype1-0.6.2
執行緒的啟動需要增加: jpype.attachThreadToJVM(),可以使用isThreadAttachedToJVM() 檢查。使用java執行緒要注意這裡不支援回撥。基於OS的執行緒通常問題不大,但是模擬執行緒,比如microthread,在java中實際為一個執行緒。
java的synchronized同步,jpype用synchronized(O)實現,返回monitor物件。monitor為GCd時會破壞鎖。
Jpype使用JNI,它並不是最有效的介面。並且Jpype橋接兩個完全不同的實時環境,需要來回轉換,效能一般。
在java中使用$來區分內部類和外部類。例如內部類Foo定義在Bar內部,在java中稱為Bar.Foo,但此時其真正的名字為Bar$Foo。
由於上述名字變異,你不能使用標準的包訪問方式來獲取它們。使用JPackage的方法getclass 來載入。
非靜態內部類不能從python程式碼中例項化。但是可以完全沒有問題地使用從java程式碼中接受到的例項。
演示:
#!python $ ipython3 Python 3.5.2 (default, Nov 23 2017, 16:37:01) Type 'copyright', 'credits' or 'license' for more information IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help. In [1]: from jpype import * In [2]: startJVM(getDefaultJVMPath(), "-ea") In [3]: java.lang.System.out.println("hello world") hello world In [4]: shutdownJVM() JVM activity report: classes loaded: 31 JVM has been shutdown
參考資料
- ofollow,noindex">https://pypi.python.org/pypi/JPype1
- https://github.com/originell/jpype
- 舊網址:http://jpype.sourceforge.net/