2013-02-13 3 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 и запускаю тесты на машине Windows из среды IntelliJ IDEA.

Plan B для меня было бы установить Jython реестр python.path с user.dir значением перед инициализацией PySysState - но это приведет к некоторому скрытому поведению.

ответ

2

Вот код для установки значения python.path реестра с user.dir в коде (Plan 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; 
} 
Смежные вопросы