JavaからJythonへのブリッジクラスを構築しています。私が解決しようとしているタスクは、Jythonにアプリケーションの作業ディレクトリ(プログラム実行ディレクトリとも呼ばれます)でPythonモジュールを検索させることです。
私はSystem.getProperty("user.dir")
sys.pathに値を追加することによってそうしています:
pySysState = new PySystemState();
//add working directory into sys.path
pySysState.path.append(new PyString(System.getProperty("user.dir")));
log_.info("Jython sys state initialized. sys.path: " + this.pySysState.path);
ImportError例外が発生します:
python module 'user_module' was not found. sys.path: ['<other jars>\\Lib', '/<path to jython>/Lib', '__classpath__', '__pyclasspath__/', 'C:\\Users\\vvlad\\IDEAProjects\\transform']
ImportError: No module named scheduled_helper
at org.python.core.Py.ImportError(Py.java:290)
at org.python.core.imp.import_first(imp.java:750)
at org.python.core.imp.import_name(imp.java:834)
...
C:\\Users\\vvlad\\IDEAProjects\\transform
アプリケーションディレクトリはどこにありますか。
そのsys.path
ように見えます:
Jythonレジストリのpython.path変数で作業ディレクトリへのフルパスを手動で指定すると、インポートは正常に機能します。そしてsys.path
異なって見えます:
>>sys.path: ['C:\\Users\\vvlad\\IDEAProjects\\transform', '<other jars path>\\Lib', '/<path to jython>/jython-2.5.2.jar/Lib', '__classpath__', '__pyclasspath__/', ]
したがって、作業ディレクトリがの最初のエントリとして来る場合、インポートは正常に機能しsys.path
ます。ただし、作業ディレクトリが最後のエントリである場合は失敗します。
Jython 2.5.2を使用しており、IntelliJIDEA環境からWindowsマシンでテストを実行しています。
私にとってのプランBは、初期化する前にJythonレジストリのpython.pathにuser.dir
値を設定することですPySysState
が、これにより、いくつかの隠れた動作が発生します。