Java用Jython,优雅的方式来解决路径问题?

时间:2012-07-05 08:43:26

标签: java import jython sys.path

我有一段Java代码,使用Jython来调用一些Python库,这个库依赖于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:没有名为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")

最好的问候

1 个答案:

答案 0 :(得分:1)

确保项目类路径中有jython-standalone.jar而不是jython.jar,因为jython-standalone.jar在jar中包含Python Lib,因此您无需将其附加到sys.path。 / p>

如果您使用的是maven,可以将其添加到pom.xml

<dependency>
    <groupId>org.python</groupId>
    <artifactId>jython-standalone</artifactId>
    <version>2.7.0</version>
</dependency>

或者您可以下载jar here

对于你自己的python模块把它放在java项目类路径中,Jython使用java classplath作为__pyclasspath__,这样就可以避免硬编码。