2014-02-11 20 views
1

我正在使用Tkinter構建Python UI。爲了程序的需要,我必須將Python與Java連接起來做一些事情,所以我使用一個簡單的Jython腳本作爲鏈接器。我不能使用Tkinter和Jython,因爲它不被支持。如何在Jython/Python中保存Java對象

Python (ui.py) -> Jython (linker.py) -> Java (compiled in jars)

要調用在Python Jython的功能我用subprocess如下:

ui.py:

cmd = 'jython linker.py"' 
my_env = os.environ 
my_env["JYTHONPATH"] = tons_of_jars 
subprocess.Popen(cmd, shell=True, env=my_env) 

然後,在Jython的文件,linker.py,我進口Java類已經添加到JYTHONPATH中,並且我創建了一個名爲m的對象並調用了Java類的一些函數。

linker.py:

import handler.handler 
m = handler.handler(foo, moo, bar) 
m.schedule(moo) 
m.getFullCalendar() 
m.printgantt() 

的事情是,我已經創建了一個m對象,將中jython linker.py結束執行後予以銷燬。 所以問題是:是否有可能將m對象保存在某個地方,以便我可以在任何時候將它從ui.py中調用它?如果不可能,是否有其他方法可以做到這一點?

在此先感謝。

+1

你嘗試過'鹹菜嗎? http://en.wikipedia.org/wiki/Pickle_%28Python%29 –

+0

我剛剛嘗試了一個簡單的Python腳本的'pickle'模塊並且可以工作。但它不適用於我的工作,因爲我必須保存一個Java對象。它給出了以下錯誤:'raise TypeError「,無法醃製%s對象」%base .__ name__'。在此先感謝 –

回答

2

我終於用ObjectOutputStream解決了問題。

from java import io 

def saveObject(x, fname="object.bin"): 
    outs = io.ObjectOutputStream(io.FileOutputStream(fname)) 
    outs.writeObject(x) 
    outs.close() 

def loadObject(fname="object.bin"): 
    ins = io.ObjectInputStream(io.FileInputStream(fname)) 
    x=ins.readObject() 
    ins.close() 
    return x 
+0

過了一段時間,但您是否還記得從文件加載對象時如何避免或處理ClassNotFoundExceptions? – styks