3

Jythonを使用してPythonライブラリを呼び出すJavaコードがあります。このライブラリはre、正規表現などの外部のJythonクラシックライブラリに依存しているため、この種のコードがあります:

    PythonInterpreter interpreter = new PythonInterpreter(null, new PySystemState()); 
    PySystemState sys = Py.getSystemState(); 

    // below: so that my own library find necessary 'batteries included' Python libs
    sys.path.append(new PyString("C:/jython2.5.2/Lib")); // (path1)
    // below: i put my own Python library inside the Java package for clarity
    // and be able to package everything in jar, well, maybe is it no a good idea?
    // also i am wondering, because myfile.py remain inside /src subdirectories 
    // while after compiling Eclipse will put most in /bin subidrectories but not the *.py files
    // thus doing some:
    //    MyJythonFactory..class.getProtectionDomain().getCodeSource().getLocation().toString() 
    // will not help to rebuild the ..myJavaProject/src/my/domain/mypackage
    sys.path.append(new PyString("D:/eclipseWorkspace/myJavaProject/src/my/domain/mypackage")); (path2)

    interpreter.exec("from mylib import myfunc"); //(A)
    PyObject myPyFunction = interpreter.get("myfunc");

(path1)ところで、パスとパスの両方を変更してハードコードする必要があるという事実は好きではありません(path2)

これを回避し、いくつかの「whereami」自動検出パス機能を追加するエレガントな方法を見つけますか (少なくとも(path2))?

そして、(path1) と (path2) の両方が必要なようです => (A) が機能するように!

また、 ImportError: No module named myModuleを持たないエレガントな方法、または次のようなハードコーディングを回避する方法として、私の質問を再定式化することもできます。

 PySystemState sys = Py.getSystemState(); 
 sys.path.append("where/my/python/libs/live/while/they/are/at/the/same/place/as/my/current/java/class")

よろしくお願いします

4

1 に答える 1