2010-03-31 3 views
6

저는 자이 썬과 자바 코드가 흩어져있는 응용 프로그램을 만들고 있습니다. 프로그램의 특성상 (wsadmin 사용) 우리는 실제로 파이썬 2.1로 제한됩니다.파이썬을 사용하여 jar 파일에서 파이썬 스크립트를 어떻게 호출합니까?

현재 자바 소스와 .py 모듈을 모두 포함하는 jar 파일이 있습니다. 이 코드는 현재 java를 사용하여 호출되지만 가능한 한 많은 기능을 자이 썬으로 마이그레이션하기 위해이 코드를 제거하고 싶습니다.

내가 가진 문제는 파이썬 모듈을 호출하는 jython 스크립트의 기존 jar 파일 내부에서 가져 오거나 실행하고 싶다는 것입니다. 나는 성공하지 않고 몇 가지 다른 방법을 시도했다. 내가 시도

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

제 1 회 접근법은 항아리에서 수입을 할 수 있었다 : 같은

내 디렉토리 구조가 보인다. jar 파일을 sys.path에 추가하고 모두 import com.example.action.myActionimport myAction을 사용하여 모듈을 가져 오려고했습니다. 그러나 각 레벨의 디렉토리에 .py 파일을 넣어도 성공하지 못합니다.

제가 시도한 두 번째 방법은 자바 클래스를 사용하여 리소스를로드하는 것이 었습니다. 그래서 아래 코드를 작성했습니다 :

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

+0

jar 파일에 있습니다. jython을 호출 할 때 classpath에 있습니다. sys.path를 출력하면 거기에 나타납니다. 그냥 철저하게 나는 sys.path.append()를 사용하여 코드에 직접 항아리를 추가하려했지만 아무런 차이가 없었습니다. – Trevor

+0

'zipimport' (http://docs.python.org/library/zipimport.html)와 하단의 예를보십시오. 'init.py'를 쓸 때,'__init __. py'를 의미합니까, 맞습니까? –

답변

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. '스크립트'
  2. 간부 스크립트와의 String로서 클래스 경로에서 스크립트를로드 임원
+0

정말 좋은 답변입니다. 조금 더 간단하게하기를 바랬지 만, 이것이 최선의 선택이라고 생각합니다. – Trevor

+0

안녕하십니까,이 스크립트를 어떻게 실행해야합니까? 고맙습니다 –

관련 문제