I have this Java code which I am using to run a python script using Jython ScriptEngine:
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);
In my python script there are several module import statements and when I run the Java code I get error as javax.script.ScriptException: ImportError: No module named psycopg2. All the modules are installed in my machine and when I run the python script normally through CLI it executes. So my understanding is that Jython classpath is looking somewhere else for the python modules.
How can I check where does the Jython ScriptEngine looks for modules and then modify it include where actually my python modules are present? I am new to this so please forgive any lack of understanding.
Note: I have CentOS and python 2.7.5 installed on my machine
sys.path is a list of strings that specifies where Jython (and Python) searches for modules. You can check its value like so:
engine.eval("import sys; print sys.path");
To add a directory to sys.path, use the JYTHONPATH environment variable. If yourmodule is installed in /path/to/modules/yourmodule, it would look like this:
export JYTHONPATH=/path/to/modules
Another way is to use the python.path property.
Unfortunately, in the case of psycopg2 the above won't help since that package is a C extension and therefore only compatible with CPython. Perhaps you can use the port of Psycopg for Ctypes instead.
An alternative way to add path to folder with custom python libs using ScriptEngine:
engine.eval("import sys; sys.path.append(\"/some/path/to/folder/withpylibs\")");
来源:https://stackoverflow.com/questions/33309860/how-to-check-the-classpath-where-jython-scriptengine-looks-for-python-module