【问题标题】:How to check the classpath where Jython ScriptEngine looks for python module?如何检查 Jython ScriptEngine 查找 python 模块的类路径?
【发布时间】:2015-10-23 19:16:26
【问题描述】:

我有这个Java 代码,我用它来运行python script 使用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);

在我的python script 中有几个模块导入语句,当我运行Java 代码时,我得到javax.script.ScriptException: ImportError: No module named psycopg2 的错误。所有模块都安装在我的机器上,当我通过 CLI 正常运行 python script 时,它会执行。所以我的理解是 Jython classpath 正在其他地方寻找 python 模块。

如何检查 Jython ScriptEngine 在哪里查找模块,然后修改它,包括我的 python 模块实际存在的位置?我是新手,所以请原谅任何缺乏理解。

注意:我的机器上安装了CentOSpython 2.7.5

【问题讨论】:

    标签: java python classpath jython scriptengine


    【解决方案1】:

    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。

    【讨论】:

    • 我应该在我的 Java 代码中编写 export JYTHONPATH 语句,对吗?如果您能解释一下您建议的 psycopg2 解决方案,是否也有可能?我是新手,所以尝试掌握信息。
    • JYTHONPATH 是一个environment variable。如果设置正确,它的值会被您的程序识别。它不是 Java 代码中的语句。
    • 一些 Python 模块在 Jython 中不起作用(因为它们是基于用 C 编写的代码),而 psycopg2 就是其中之一。是否设置了JYTHONPATH 无关紧要。在我链接到的 psycopg2 安装页面上,它说“有 Psycopg 的 Ctypes 实验性移植,但它还没有 C 实现成熟”。所以可能是你的解决方案。如果您在这部分问题上需要帮助,我建议您单独提出一个问题。
    • 我再次为我有点缺乏理解而道歉。那么我们是在某个文件中设置JYTHONPATH 环境变量还是我只是从CLI 执行命令?
    • export JYTHONPATH=/path/to/modules 是一个 bash shell 命令。如果您使用另一个 shell,则语法会有所不同。该命令可以在每个 shell 中键入和执行,也可以放在配置文件中,例如.bashrc,这样每次启动新 shell 时它都会自动运行。环境变量也可以在 Eclipse 等 IDE 中定义。
    【解决方案2】:

    使用 ScriptEngine 将路径添加到具有自定义 python 库的文件夹的另一种方法:

    engine.eval("import sys; sys.path.append(\"/some/path/to/folder/withpylibs\")");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-14
      • 2012-10-30
      • 2012-08-27
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多