установка пути модуля импорта в Jython - странное поведение

Я создаю класс моста Java для Jython. Задача, которую я пытаюсь решить, состоит в том, чтобы заставить Jython искать модули python в рабочем каталоге моего приложения (также известном как каталог выполнения программы).

Я делаю это, добавляя значение 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 выглядит так:

Импорт работает нормально, когда я вручную указываю полный путь к рабочему каталогу в переменной python.path реестра Jython. И 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.

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


person vvladymyrov    schedule 13.02.2013    source источник


Ответы (1)


Вот код для установки значения реестра python.path с user.dir в вашем коде (план B, о котором я упоминал в вопросе):

Вот как вы инициализируете 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;
}
person vvladymyrov    schedule 14.02.2013