2013-02-13 5 views
4

나는 자이 썬 브리지 클래스에 자바를 구현하고있다. 내가 해결하려고하는 작업은 응용 프로그램 작업 디렉토리 (프로그램 실행 디렉토리라고도 함)에서 Python 모듈을 찾도록 자이 썬을 만드는 것이다.자이 썬에서 가져 오기 모듈 경로 설정 - 이상한 동작

나는 sys.path에에 System.getProperty("user.dir") 값을 추가하여 그렇게하고 있어요는 : C:\\Users\\vvlad\\IDEAProjects\\transform 응용 프로그램 디렉토리

python module 'user_module' was not found. sys.path: ['<other jars>\\Lib', '/<path to jython>/Lib', '__classpath__', '__pyclasspath__/', 'C:\\Users\\vvlad\\IDEAProjects\\transform'] 
ImportError: No module named scheduled_helper 

at org.python.core.Py.ImportError(Py.java:290) 
at org.python.core.imp.import_first(imp.java:750) 
at org.python.core.imp.import_name(imp.java:834) 
    ... 

입니다 :

pySysState = new PySystemState(); 
//add working directory into sys.path 
pySysState.path.append(new PyString(System.getProperty("user.dir"))); 
log_.info("Jython sys state initialized. sys.path: " + this.pySysState.path); 

나는 ImportError를 예외를 얻을. sys.path에서

은 다음과 같습니다 내가 수동으로 자이 썬 레지스트리 python.path 변수에 작업 디렉토리에 전체 경로를 지정할 때

가져 오기가 잘 작동합니다. 그리고 sys.path 다른 모양 : 디렉토리를 작업하는 sys.path의 첫 번째 항목으로 올 때

>>sys.path: ['C:\\Users\\vvlad\\IDEAProjects\\transform', '<other jars path>\\Lib', '/<path to jython>/jython-2.5.2.jar/Lib', '__classpath__', '__pyclasspath__/', ] 

그래서 가져 오기가 잘 작동합니다. 그러나 작업 디렉토리가 마지막 항목 일 때 실패합니다.

저는 Jython 2.5.2를 사용하고 IntelliJ IDEA 환경에서 Windows 컴퓨터에서 테스트를 실행합니다.

플랜 B는 PySysState을 초기화하기 전에 자이 톤 레지스트리 python.path를 user.dir 값으로 설정하는 것이지만 일부 숨겨진 동작을 유발합니다. 여기

답변

2

는 (계획 BI 질문에서 언급 한) 코드에서이 user.dir로 레지스트리 python.path 값을 설정하는 코드입니다

여기

은 당신이 PySysState 초기화 방법 :

props = setDefaultPythonPath(props); 
PySystemState.initialize(System.getProperties(), props, null); 

setDefaultPythonPath 방법을 :

/** 
* Adds user.dir into python.path to make Jython look for python modules in working directory in all cases 
* (both standalone and not standalone modes) 
* @param props 
* @return props 
*/ 
private Properties setDefaultPythonPath(Properties props) { 
    String pythonPathProp = props.getProperty("python.path"); 
    String new_value; 
    if (pythonPathProp==null) 
    { 
     new_value = System.getProperty("user.dir"); 
    } else { 
     new_value = pythonPathProp +java.io.File.pathSeparator + System.getProperty("user.dir") + java.io.File.pathSeparator; 
    } 
    props.setProperty("python.path",new_value); 
    return props; 
}