我可以使用其中包含以下代码的应用程序:
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("import os");
interpreter.exec("import mylib");
以下是resources/Lib/mylib/__init__.py
:
from __future__ import print_function
from . import myfriend as thing
import os
print("Yep, everything works")
并使用 maven 编译它,产生一个my-app-with-dependencies.jar
我可以轻松地运行它,java -jar my-app-with-depenendencies.jar
它工作得很好,万岁!
这是可悲的部分出现的地方。我可以将完全相同的代码放入 Spring 处理程序中:
@RequestMapping("/doesnotwork")
public @ResponseBody String sadness() {
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("import os");
interpreter.exec("import mylib");
return "Quoth the Java, nevermore";
}
神奇的是,这不再有效。一点点都没有。
但是,我可以将我的文件从移动resources/Lib/
到webapp/WEB-INF/lib/Lib/
并import mylib
工作。但在mylib
我不能再从__future__
or导入os
。我可以import sys
,我的 sys.path 看起来像这样:
['/path/to/my/webapp/WEB-INF/lib/Lib', '__classpath__', '__pyclasspath__/']
我的sys.path_importer_cache
样子是这样的:
{'__classpath__': <type 'org.python.core.JavaImporter'>,
'/path/to/my/webapp/WEB-INF/lib/Lib': None,
'/path/to/my/webapp/WEB-INF/lib/Lib/mylib': None,
'__pyclasspath__/': <ClasspathPyImporter object at 0x2>}
我做错了什么,我无法导入标准库?/path/to/my/webapp/WEB-INF/lib
包含jython-2.7-b1.jar
和jython-standalone-2.7-b1.jar
。我什至尝试将这些 jar 文件插入到我的路径中,但仍然没有骰子。
我可以从文件夹中的 .jar 文件导入java类,但 jython .jar 中的文件除外。例如,里面jython-2.7-b1.jar
是org/python/apache/xml/serialize/Serializer.class
。我可以导入org.python
,但只有存在org.python.__name__
。