在Jython中设置导入模块路径 - 奇怪的行为(setting import module pat

2019-08-16 23:25发布

我建立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看起来像这样:

导入工作正常,当我手动指定在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计划对我来说是设置使用Jython注册表python.path user.dir初始化前值PySysState -但这会引入一些隐藏的行为。

Answer 1:

下面是在你的代码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;
}


文章来源: setting import module path in Jython - strange behavior