2010-03-31 105 views
6

我正在研究穿插一堆jython和java代碼的應用程序。由於程序的性質(使用wsadmin),我們實際上僅限於Python 2.1如何在使用python的jar文件中調用python腳本?

我們目前有一個包含java源代碼和.py模塊的jar。該代碼目前使用java調用,但我想刪除這個,以便儘可能多地將功能遷移到jython。

我遇到的問題是我想從調用jython腳本導入或執行現有jar文件中的python模塊。我嘗試了幾種不同的方式,但都沒有成功。

我的目錄結構如下:

application.jar 
    |-- com 
     |--example 
      |-- action 
       |-- MyAction.class 
       |-- pre_myAction.py 

首屆方法我試過是做從罐子進口。我添加了jar到我的sys.path,並試圖導入模塊使用兩個import com.example.action.myActionimport myAction。但是,即使我將init .py文件放入每個級別的目錄中,也沒有成功。

我試過的第二種方法是使用java類加載資源。所以我寫了下面的代碼:

import sys 
import os 
import com.example.action.MyAction as MyAction 

scriptName = str(MyAction.getResource('/com/example/action/myAction.py')) 
scriptStr = MyAction.getResourceAsStream('/com/example/action/myAction.py') 

try: 
    print execfile(scriptStr) 
except: 
    print "failed 1" 

try: 
    print execfile(scriptName) 
except: 
    print "failed 2" 

這兩個都失敗了。至於我應該如何繼續,我現在有點不知所措。有任何想法嗎 ?

歡呼聲,

特雷弗

+0

什麼是'scriptName'和'scriptStr'的內容? – badp 2010-03-31 08:01:03

+0

在jar文件中。它在調用jython的類路徑中。如果我打印sys.path,你會在那裏看到它。只是爲了徹底,我已經嘗試使用sys.path.append()將代碼直接添加到代碼中,但它沒有任何區別。 – Trevor 2010-03-31 08:12:44

+0

看看'zipimport'(http://docs.python.org/library/zipimport.html)和底部的例子。當你寫'init.py'時,意思是'__init __。py',對吧? – 2010-03-31 09:15:23

回答

5

以下工作對我來說:

import sys 
import os 

import java.lang.ClassLoader 
import java.io.InputStreamReader 
import java.io.BufferedReader 

loader = java.lang.ClassLoader.getSystemClassLoader() 
stream = loader.getResourceAsStream("com/example/action/myAction.py") 
reader = java.io.BufferedReader(java.io.InputStreamReader(stream)) 

script = ""       
line = reader.readLine() 
while (line != None) : 
    script += line + "\n" 
    line = reader.readLine() 

exec(script) 
  1. 從CLASSPATH在 '腳本'
  2. EXEC腳本用字符串加載腳本exec
+0

這是一個非常好的答案。我希望稍微簡單些,但我認爲這可能是最好的選擇。 – Trevor 2010-04-01 01:20:07

+0

你好,請問我們應該如何運行這個腳本。謝謝 – 2017-04-20 08:26:41

相關問題