问题
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
回答1:
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.
回答2:
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