2013-02-13 50 views
4

我正在構建Java到Jython橋接類。 我試圖解決的任務是讓Jython在我的應用程序工作目錄(也稱爲程序執行目錄)中查找python模塊。在Jython中設置導入模塊路徑 - 奇怪的行爲

我通過附加System.getProperty("user.dir")值移到sys.path這樣做:

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異常:

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) 
    ... 

哪裏C:\\Users\\vvlad\\IDEAProjects\\transform是應用程序目錄。

sys.path看起來像這樣:

導入工作正常,當我手動指定在Jython註冊表python.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__/', ] 

所以導入工作正常時,工作目錄當屬sys.path第一項。但工作目錄是最後一個條目時失敗。

我正在使用Jython 2.5.2並從IntelliJ IDEA環境在Windows機器上運行測試。

對於我來說,B計劃將在初始化PySysState之前設置Jython註冊表python.path與user.dir值 - 但這會引入一些隱藏行爲。

回答

2

這裏是在你的代碼user.dir來設置註冊表python.path值代碼(BI規劃中提到的問題):

這裏是你如何初始化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; 
}