2010-03-31 26 views
6

Pracuję nad aplikacją, która przeplata kilka jython i kodu Java. Ze względu na naturę programu (za pomocą wsadmin) tak naprawdę jesteśmy ograniczeni do Pythona 2.1Jak wywołać skrypt Pythona wewnątrz pliku jar przy użyciu Pythona?

Mamy obecnie słoik zawierający zarówno źródło java, jak i .py. Kod jest obecnie wywoływany za pomocą java, ale chciałbym go usunąć na korzyść migracji jak najwięcej funkcjonalności do jython.

Problem polega na tym, że chcę importować lub uruchamiać moduły python wewnątrz istniejącego pliku JAR ze skryptu wywołującego jython. Próbowałem na kilka różnych sposobów bez powodzenia.

Moja struktura katalogów wygląda następująco:

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

The 1st podejście próbowałem było zrobić import ze słoika. Dodałem słoik do mojego sys.path i spróbowałem zaimportować moduł, używając zarówno importu importu com.example.action.myAction jak i import myAction. Bez powodzenia, nawet gdy wstawiam pliki init do katalogu na każdym poziomie.

Drugie podejście, które próbowałem, to załadowanie zasobu przy użyciu klasy java. Więc napisałem poniższy kod:

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" 

Oba te elementy nie powiodły się. Trochę tracę teraz informacji na temat tego, jak powinienem postępować. Jakieś pomysły ?

okrzyki,

Trevor

+0

czym są zawartość 'scriptName' i' scriptStr'? – badp

+0

W pliku jar. Jest na ścieżce klasowej, gdy wzywam jython. Jeśli wydrukuję sys.path, zobaczysz go tam. Po prostu starałem się dodać słoik bezpośrednio do kodu przy użyciu sys.path.append(), ale nie robiło to żadnej różnicy. – Trevor

+0

Spójrz na 'zipimport' (http://docs.python.org/library/zipimport.html) i na przykład na dole. Kiedy piszesz 'init.py', to znaczy' __init __. Py', prawda? –

Odpowiedz

5

następujące prace dla mnie:

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. Ładowanie skryptu ze ścieżki klasy jako ciąg 'skrypt'
  2. exec skrypt z exec
+0

To jest naprawdę dobra odpowiedź. Miałem nadzieję na coś prostszego, ale myślę, że to prawdopodobnie najlepsza opcja. – Trevor

+0

witam, mógłbyś dodać, jak powinniśmy uruchomić ten skrypt. Dziękuję Ci –

Powiązane problemy