4

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が、これにより、いくつかの隠れた動作が発生します。

4

1 に答える 1

2

コードにuser.dirを使用してレジストリpython.path値を設定するためのコードは次のとおりです(質問で言及されているPlan BI):

PySysStateを初期化する方法は次のとおりです。

props = setDefaultPythonPath(props);
PySystemState.initialize( System.getProperties(), props, null );

setDefaultPythonPathメソッド:

/**
 * Adds user.dir into python.path to make Jython look for python modules in working directory in all cases
 * (both standalone and not standalone modes)
 * @param props
 * @return props
 */
private Properties setDefaultPythonPath(Properties props) {
    String pythonPathProp = props.getProperty("python.path");
    String new_value;
    if (pythonPathProp==null)
    {
        new_value  = System.getProperty("user.dir");
    } else {
        new_value = pythonPathProp +java.io.File.pathSeparator + System.getProperty("user.dir") + java.io.File.pathSeparator;
    }
    props.setProperty("python.path",new_value);
    return props;
}
于 2013-02-14T16:50:27.090 に答える