java - 在 Jython 中设置导入模块路径 - 奇怪的行为

标签 java jython importerror jython-2.5 sys.path

我正在构建 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 并在 Windows 机器上从 IntelliJ IDEA 环境运行测试。

对我来说,B 计划是在初始化 PySysState 之前使用 user.dir 值设置 Jython 注册表 python.path - 但这会引入一些隐藏行为。

最佳答案

这是在您的代码中使用 user.dir 设置注册表 python.path 值的代码(我在问题中提到的计划 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;
}

关于java - 在 Jython 中设置导入模块路径 - 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14862277/

相关文章:

java - 如何使用应用程序属性和 pom 文件共享/传递变量

Java栈队列获取可查看前台人数

pip - jython.exe "2.7.0 final release"在我的 Windows 操作系统上执行失败

python - 如何将文件下载到服务器中的特定路径 : Python

java - 仅使用默认库在 jython 中解码 json

java - 在在线应用程序中使用Java Executor服务

java - 在 Encog Java 库上导入权重

Python/IPython 导入错误 : no module named site

python - 无法安装 PyPdf 2 模块

python - 绝对导入不起作用,但相对导入起作用