我正在为Jython桥类构建Java。 我正在尝试解决的任务是让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
中看起来像这样:
导入工作正常。 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计划是在初始化user.dir
之前将Jython注册表python.path设置为PySysState
- 但这会引入一些隐藏的行为。
答案 0 :(得分:2)
以下是在代码中使用user.dir设置注册表python.path值的代码(我在问题中提到的Plan 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;
}