我有这个Java
代码,我使用Jython
ScriptEngine
运行python script
:
StringWriter writer = new StringWriter();
ScriptEngineManager manager = new ScriptEngineManager();
ScriptContext context = new SimpleScriptContext();
context.setWriter(writer);
ScriptEngine engine = manager.getEngineByName("python");
engine.eval(new FileReader("/Users/folder1/test.py"), context);
在我的python script
中有几个模块导入语句,当我运行Java
代码时,我得到错误为javax.script.ScriptException: ImportError: No module named psycopg2
。所有模块都安装在我的机器上,当我通过CLI正常运行python script
时,它会执行。所以我的理解是,Jython
classpath
正在寻找其他地方的python
模块。
我如何检查Jython
ScriptEngine
在哪里寻找模块,然后修改它,包括实际上我的python
模块存在的地方?我是新手,所以请原谅我的理解不足。
注意:我的机器上安装了CentOS
和python 2.7.5
sys.path
是一个字符串列表,它指定Jython(和Python)在哪里搜索模块。你可以像这样检查它的值:
engine.eval("import sys; print sys.path");
添加目录到sys.path
,使用JYTHONPATH
环境变量。如果yourmodule
安装在/path/to/modules/yourmodule
中,它看起来像这样:
export JYTHONPATH=/path/to/modules
另一种方法是使用python.path
属性
不幸的是,在psycopg2的情况下,上述内容不起作用,因为该包是C扩展,因此仅与CPython兼容。也许您可以将Psycopg移植到Ctypes。
使用ScriptEngine向带有自定义python库的文件夹添加路径的另一种方法:
engine.eval("import sys; sys.path.append("/some/path/to/folder/withpylibs")");