次のコードを含むアプリケーションを取得できます。
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";
}
そして魔法のように、これはもはや機能しません。ちょっとじゃない。
ただし、ファイルを移動して動作させることはできます。しかし、内では、またはからインポートできなくなりました。できます。sys.path は次のようになります。resources/Lib/
webapp/WEB-INF/lib/Lib/
import mylib
mylib
__future__
os
import sys
['/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>}
stdlib をインポートできないというのは、何が間違っているのでしょうか? と/path/to/my/webapp/WEB-INF/lib
の両方が含まれます。これらのjarファイルを自分のパスに挿入しようとしましたが、サイコロはまだありません。jython-2.7-b1.jar
jython-standalone-2.7-b1.jar
jython .jars にあるものを除いて、フォルダにある .jar ファイルからJavaクラスをインポートできます。たとえば、内部jython-2.7-b1.jar
はorg/python/apache/xml/serialize/Serializer.class
. インポートできますorg.python
が、存在するのはorg.python.__name__
.